实例属性和类属性
理论基础
类属性有点类似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)
实例属性操作
重载object方法
如果我们要控制自己类中的实例属性,可以通过重载以下几个方法来实现特殊功能
★这些方法不能对类属性进行操作
__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__'
使用property
一般函数实现
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)
《本节完》