一、property属性
class People:
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name
@name.setter
def name(self,value):
self.__name=value
二、__getattr__和__getattribute__区别
__getattr__是在找不到属性的时候会进入到该魔法方法
__getattribute__是需要寻找属性的时候先进入该魔法方法
三、属性描述符和属性查找过程
属性描述符:
1、数据属性描述符
__get__、__set__、__delete__
2、非数据属性描述符
__get__
属性查找过程
有一个User类、查找实例user.age
1、调用__getattribute__
2、__get__发生在__getattribute__中
3、如果age在类中或者类的基类中,且age是数据描述符、优先调用数据描述符的__get__
4、age在实例的__ dict__中,直接返回user.__dict__['age']
5、age在类中或者基类的__dict__中
5.1、age是非数据描述符、调用非数据描述符的__get__
5.2、返回User.__dict__['age']
6、__getattribute__抛出AttributeError,进入__getattr__
四、__new__和__init__区别
__new__创建实例
__init__完善实例
五、元类
创建类的类叫做元类、type就是元类