1.补充内置函数
2.反射
什么是?
通过字符串操作类或者对象的属性
hasattri(a,"b") 判断能否访问到a.b
setattri(a,"b",c)设置a.b=c
3.自定义内置方法定制类的功能
对象被打印时自动触发__str__
__del__用在回收应用程序对象时候顺便把占的操作系统的资源也回收
4.元类
什么是?
py中一切皆对象,用class 关键字定义的类本身也是对象,负责产生该对象的类为元类
为何用?
元类负责产生类的,所以学习元类或者自定义元类的目的是控制类的产生过程,还可以控制对象的产生过程
如何用?
exec 的用法:
将字符串中的代码提取出来运行,运行字符串内的代码
创建类的三要素:
类名,基类,类的名称空间
class_name="people"
class_bases=(object,) 元组
class_dic={}
class_body=''' '''
exec(class_body,{},class_dic)
people=type(class_name,class_bases,class_dic)
创建类的两种方法:
1.用的class关键字创建,默认元类是type
如果类也是对象的话,该过程也是实例化
2.用自定义的元类
class Mymeta:
pass
class people(object,metaclass=Mymeta):
pass
分析自定义类的原理,非元类的原理
1.拿到字符串格式的类名 "people"
2.拿到类的基类们__bases__(object,)
3.执行类体代码,拿到名称空间 class_dic={}
4.调用people=type(class_bases,class_bases,class_dic)
class mymate(type) 只有继承了type才是元类,否则是个普通的自定义类
自定义元类控制类的产生过程,类的产生过程其实就是元类的调用过程,即类的实例化过程
class Foo()
pass
obj=Foo()
obj()
对象的类中定义__call__
要想调用obj,必须控制Foo(元类)中的call方法
把类也看成对象,也需要call方法
调用
自定义类的实例化过程
1.在mymeta里面先造people的空对象obj= self.__new__(self) #括号里传self,就是people
__new__的顺序:查找从people找到mymeta再到type
2.初始化独有的属性 self.__init__(obj.*args,**kwargs) 调用people是调用call方法 3.return obj #返回初始化好的对象