读书笔记:
attribute 是属性的意思,property是特性的意思。
Part A
处理属性的内置函数(BIF):
dir([object]):列出对象 的大多数属性
getattr(object,name[,default]):从对象中获取name字符串对应的属性
hasattr(object,name):如果对象存在指定的属性,返回True
setattr(object,name,value):将对象指定属性的值设为value,可能创建一个新属性,或覆盖现有的属性
vars([object]):返回对象的dict属性
Part B
处理属性的特殊方法:
__getattribute__(self,name)
__getattr__(self,name)
__setattr__(self,name,value)
__delattr__(self,name)
__dir__(self)
Part C
特性property的应用
>>> class C:
def __init__(self,size = 10):
self.size = size
def getSize(self):
return self.size
def setSize(self,value):
self.size = value
def delSize(self):
del self.size
p = property(getSize,setSize,delSize)
>>> c = C()
>>> c.p
10
>>> c.p = 1
>>> c.p
1
>>> c.size
1
>>> del c.p
>>> c.size
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
c.size
AttributeError: 'C' object has no attribute 'size'
第0题 改写getattr
>>> class C:
def __getattr__(self,name):
print("该属性不存在!")
>>> c = C()
>>> c.x
该属性不存在!
第1题 改写getattr
当对象name属性不存在时,调用__getattr__(self,name);
给name属性赋值,并返回该值;
>>> class Demo:
def __getattr__(self,name):
self.name = "this is a sign"
return self.name
#以下不需要重写
#def __setattr__(self,name,value):
#super().__setattr__(name,value)
#def __getattribute__(self,name):
#super().__getattribute__(name)
>>> demo = Demo()
>>> demo.x
'this is a sign'
>>> demo.x = 1
>>> demo.x
1
>>> demo.x = "X-man"
>>> demo.x
'X-man'