多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg) ***** ### \_\_getattr\_\_和\_\_getattribute\_\_魔法函数 ~~~ from datetime import date,datetime class User: def __init__(self,name,birthday): self.name = name self.birthday = birthday def __getattr__(self,item): print("not find attr") def __getattribute__(self,item): return "juran" if __name__ == "__main__": user = User("juran",date(year=1990,month=1,day=1)) print(user.age) ~~~ ### 属性描述符 ~~~ class User: def __init__(self,age): self.age = age def get_age(self): return (str(self.age) + '岁') def set_age(self,age): if not isinstance(age,int): raise TypeError('Type Error') self.age = age ~~~ 如果User类中有多个属性都需要判断,那么就需要写多个方法,这些方法怎么复用呢?这个时候就要用到属性描述符 ~~~ 属性描述符,只要实现了__get__,__set__,__delete__任何一个方法,就被称为属性描述符 ~~~ ### 属性查找顺序 ~~~ user = User(), 那么user.age 顺序如下: 1 如果"age"是出现在User或其基类的__dict__中, 且age是data descriptor,那么调用其__get__方法, 否则 2 如果"age"出现在user的__dict__中, 那么直接返回 obj.__dict__['age'],否则 3 如果"age"出现在User或其基类的__dict__中 3.1 如果age是non-data descriptor,那么调用其__get__方法, 否则 3.2 返回 __dict__['age'] 4 如果User有__getattr__方法,调用__getattr__方法,否则 5 抛出AttributeError ~~~ ### 自定义元类 动态创建类 ~~~ def create_class(name): if name == "user": class User: def __str__(self): return "user" return User elif name == "student": class Student: def __str__(self): return "Student" return Student if __name__ == "__main__": myclass = create_class('user') obj = myclass() print(obj) print(type(obj)) ~~~ ### 使用type创建类 type还可以动态的创建类,type(类名,由父类组成的元组,包含属性的字典) * 第一个参数:name表示类名称,字符串类型 * 第二个参数:bases表示继承对象(父类),元组类型,单元素使用逗号 * 第三个参数:attr表示属性,这里可以填写类属性、类方式、静态方法,采用字典格式,key为属性名,value为属性值 ### metaclass属性 如果一个类中定义了metalass = xxx,Python就会用元类的方式来创建类