''''''
'''
一、昨日内容回顾
1、依赖关系
1、弱关系、多态
1、松耦合
2、大象可以装冰箱,也可以装高压锅,就是多态 2、例子:
1、大象装冰箱
2、大象装高压锅
3、你打车 3、写法
大象类中的普通方法的参数是冰箱对象
大象类中的普通方法体是冰箱对象.冰箱的普通方法 2、关联关系
1、一对一
1、强关系
2、例子
1、男女朋友 3、写法
1、男孩类的普通方法的参数是女孩对象
2、男孩类的普通方法体是
self.girl_friend = girl
#用self.girl_friend指代女孩对象 2、一对多
1、强关系
2、例子
1、学校和老师
3、写法
1、学校类的构造方法中,定义老师列表-空列表(可以定义私有变量)
2、学校类的普通方法中-招聘(参数是老师对象)
老师列表中追加老师对象
3、学校类的普通方法-展示
循环遍历老师的姓名 3、一对一和一对多的区别
一、写法不同
1、前者
男孩类的成员方法
def meet(self,girl): #参数是女孩对象 女孩对象传递给男孩的女朋友这个成员变量
self.girl_friend = girl #关键点
#男孩对象的成员变量-girl_friend就是女孩对象 2、后者
学校类的构造方法
self.__techer_list = []
学校类的成员方法
def recruit(self,t): #招聘-成员方法 参数t是老师对象
self.__techer_list.append(t) 二、例子不同
1、前者的例子是男女朋友
2、后者的例子是学校和老师 3、特殊成员
1、 __init__()
#新建对象的时候,自动调构造方法 2、 __str__()
1、打印对象的时候,默认打印对象的内存地址
2、如果在__str__()方法中,返回自定义的字符串,那么
打印对象的时候,就不是内存地址,而是自定义的字符串
3、注意点:
__str__() 方法的返回值的类型必须是字符串,而不能是元组,否则会报错 3、 __new__()
创建对象的过程
1、加载类 2、开辟内存空间
通过__new__(cls)方法 3、创建对象
通过__new__(cls)方法的返回值
return object.__new__(cls)来创建对象
注意点:__new__()的参数是cls类,而不是对象
(因为现在对象还没有创建出来) 4、初始化对象
创建对象的时候,自动调构造方法
把成员变量封装到对象中 5、使用对象
对象调成员方法、调成员变量 4、 __call__()
对象名后面加上小括号,就是调了__call__()方法 5、 __enter__()
6、 __exit__()
__enter__()方法
return var1
__exit__()方法
with 对象 as 变量:
print var1 #这里的var1是__enter__方法的返回值
1、说明:
with的执行过程
1、先执行__enter__方法
2、再执行with中的代码块
3、最后执行__exit__方法 7、 __setitem__()
8、 __delitem__()
9、 __getitem__()
def __getitem__(self, item):
print('我是__getitem__方法',item) def __setitem__(self, key, value):
print('我是__setitem__方法',key,value) def __delitem__(self, key):
print('我是__delitem__方法',key) f1['name'] #我是__getitem__方法 name
#这里调用的是__getitem__()方法 f1['name'] = 'jack' #我是__setitem__方法 name jack
#这里调用的是__setitem__()方法 del f1['name'] #我是__delitem__方法 name
#这里调用的是__delitem__()方法 10、 __hash__()
1、类和对象都是可哈希的-不可变的,可以作为字典的key
因为类都是object的子类,object类中有__hash__()方法
2、 __hash__ = None
在类中加入上面一行,就是重写了其父类object的__hash__()方法
类名和该类名对应的对象名就变成了不可哈希-可变的,不能作为字典的key了 二、今日主要内容
1、 issubclass type isinstance
issubclass(类名1,类名2) #判断参数1是否是参数2的后代(子类,孙子类),是的话,返回True type 给出xxx的数据类型,给出创建这个对象的类 isinstance 参数1-对象名 参数2-类名 判断对象是否是类及其子类的对象---重点1 2、如何分辨方法和函数
在外面定义的函数一定是函数
在类中:
1. 普通方法: 如果是对象访问.方法,, 如果是类名访问是函数
2. 静态方法: 都是函数
3. 类方法: 都是方法
4、属性:是变量(不是函数,也不是方法) isinstance(args,MethodType)和isinstance(args,FunctionType)
是用于判断函数的参数是方法还是函数类型
参数可以是(普通方法名、静态方法名、类方法名、属性) 3、反射--重点2
1、重点
getattr(对象名,函数名或者变量名)
参数列表:参数1是对象或者类,参数2是要查找的函数名或者变量名
作用:从对象中(对象或者类中)查找指定的内容
使用:找到后将内存地址存在变量中,变量名后面加上小括号,就是调用函数
ret1 = getattr(p1,'eat') #或者函数eat的内存地址
ret1() #函数的内存地址后面加上小括号 hasattr(对象名,函数名或者变量名)
参数列表:参数1是对象或者类,参数2是要查找的函数名或者变量名
作用:判断对象中(对象或者类中)是否有你要查找的指定内容 和if
使用:有的话,就接着使用getattr
没有的话,就提示没有你要找的指定内容
if hasattr(p1,'eat'): #注意点:函数名加上引号
ret1 = getattr(p1,'eat') #或者函数eat的内存地址
ret1() #函数的内存地址后面加上小括号
else:
print('你要查找的内容不存在') 2、次重点 在内存层面修改,文件并没有修改
setattr(对象名,变量名,变量值)
参数列表:参数1是对象或者类,参数2是变量名,参数3是变量的值
作用:给对象(对象或者类)的构造方法中,新增一个变量--内存层面,临时增加
setattr(p1,'age',18) #注意点:变量名要加上引号 delattr(对象名,变量名)
参数列表:参数1是对象、类、模块py文件,参数2是变量名
作用:删除类中构造方法的一个变量--内存层面,临时删除
delattr(p1,'age') #注意点:变量名要加上引号
delattr(p1,'name') #从对象中删除变量(成员变量)
delattr(Person,'eat') #从类中删除函数eat
delattr(master,'eat') #从模块py文件中删除方法eat 前19天小结
1、基本数据结构
2、三大器(迭代器、生成器、装饰器)
3、面向对象
4、反射 '''

Python【day 19】反射的更多相关文章

  1. python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

    一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  2. python中的反射

    在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...

  3. Python基础之反射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  4. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  5. Python之路- 反射&定制自己的数据类型

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...

  6. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  7. Python面向对象之-反射

    Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr  判断是否有改属性或者方法,有返回True,没有返回false getattr  如果是属性获得该属性 ...

  8. Python Python中的反射机制

    Python中的反射机制 by:授客 QQ:1033553122 概念 借用java中的定义:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方 ...

  9. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try:     <............. ...

  10. 「Python」19个python编写技巧

    1. 交换赋值 2. Unpacking 3. 使用操作符in 4. 字符串操作 5. 字典键值列表 6. 字典键值判断 7. 字典 get 和 setdefault 方法 8. 判断真伪 9. 遍历 ...

随机推荐

  1. 多进程 多进程queue

    多进程 import multiprocessing import threading import time def thread_run(): print(threading.get_ident( ...

  2. java 作业11.4

    package text3; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import ...

  3. vjudge Trailing Zeroes (III) (二分答案 && 数论)

    嗯... 题目链接:https://vjudge.net/contest/318956#problem/E 这道题是二分答案+数论,但首先是数论,否则你不知如何二分... 首先关于一个阶乘的结果最后会 ...

  4. 腾讯云 docker 镜像 dotnet/core sdk aspnet

    ccr.ccs.tencentyun.com/mcr.microsoft.com/dotnetcoresdk  = mcr.microsoft.com/dotnet/core/sdk  => 3 ...

  5. 【转】issue management in your test project

    What is Issue Management? Issue Management is the process to make others aware of the problem and th ...

  6. 并发编程之GIL

    目录 GIL 什么是GIL锁 为什么需要加锁 带来的问题 如何解决 关于性能的讨论 计算密集型任务:进程执行更快 IO密集型:线程执行更快 自定义锁与GIL的区别 GIL 什么是GIL锁 官方解释: ...

  7. linux--用户管理--useradd

    用户分类 1 root 超级管理员 2 系统用户 就是 某一个服务中 自动产生的用户 不是认为创建的,不能用于登录计算机 只是保证某一个服务的正常运行 比如数据库 3 普通用户 用户必须属于一个且只有 ...

  8. go笔记(go中的方法调用)

    最近接触go语言  发现和java的方法调用有些类似但又有自己的注意点 go的包我理解为则是隔离的最小模块 先在src目录下创建main.go文件  package为main,然后在src下创建mod ...

  9. VS Code 入门

    将VSCode设置成中文语言环境 快捷键[Ctrl+Shift+P]—输入[Configure Display Language]—将“en”改为“zh-CN”—打开extention输入[Chine ...

  10. keil中的一些技巧

    一  在Keil5中使用代码格式化工具Astyle(插件)https://blog.csdn.net/u010160335/article/details/78587411 二 将keil中的内存变量 ...