类属性有点类似C++中的静态变量,可以通过 【类名.属性 】直接访问
实例属性故名思议就是只有定义了类的实例后才可以用的属性
通过类名不可以访问实例属性
通过实例可以访问类属性
如果实例属性给类属性进行了赋值操作,则会将其覆盖。
class SYG(object): class_var = 1 def __init__(self): self.instance_var = 2 if __name__ == '__main__': syg = SYG() #可以通过实例来反访问类属性 print(syg.class_var) print(SYG.class_var) #不可以用类名访问实例变量 #print(SYG.instance_var) #实例属性会覆盖类属性 syg.class_var = 3 print(syg.class_var) print(SYG.class_var)
如果我们要控制自己类中的实例属性,可以通过重载以下几个方法来实现特殊功能
★这些方法不能对类属性进行操作
__getattr__ 访问在类中未被定义的属性时会被调用
__setattr__ 设置所有的属性时被调用
__delattr__ 删除所有的属性时被调用
__getattribute__ 访问所有的属性时会被调用,这个被重载后。包含__getattr__
代码示例:class SYG(object): def __init__(self): self.xx = 0 def __getattr__(self,name): print("override getattr") return object.__getattr__(self,name) def __setattr__(self,name,value): print("override setattr") return object.__setattr__(self,name,value) def __delattr__(self,name): print('override delattr') return object.delattr(self,name) def __getattribute__(self,name): print('override getattribute') return object.__getattribute__(self,name) if __name__ == '__main__': syg = SYG() syg.test = 3 print(syg.test) print(syg.ok) #由于存在这个属性会抛出异常
override setattr
override getattribute
3
override getattribute
override getattr
Traceback (most recent call last):
File "temp.py", line 27, in <module>
print(syg.ok)
File "temp.py", line 9, in __getattr__
return object.__getattr__(self,name)
AttributeError: type object 'object' has no attribute '__getattr__'
class SYG(object): def __init__(self): self._x = 0 def getx(self): print("getx") return self._x def setx(self,value): print('setx') self._x = value def delx(self): del self._x #定义自己的set,get,del操作 newx = property(getx, setx, delx) if __name__ == '__main__': syg = SYG() syg.newx = 3 print(syg.newx)
class SYG(object): def __init__(self): self._x = 0 @property def var_x(self): print('readonly _x') return self._x @var_x.setter def var_x(self,value): print('setx') self._x = value @var_x.deleter def var_x(self): del self._x if __name__ == '__main__': syg = SYG() syg.var_x = 3 print(syg.var_x)
《本节完》