我在想怎么让一个属性只读,这让我想起来了classmethod,都知道classmethod就是只能让类来调用,所以呢,这里它们都用到一个东西描述符。
1描述符有两种:
1)数据描述符,实现了__get__和__set__的类。
2)非数据描述符,只实现了__get__的类。
2,实例查找属性的顺序链,ex,obj = EX(),在访问obj.attr的时候,
1)如果attr存在是数据描述符且存在于EX或者其父类中,则直接返回。
2)如果attr存在是属性且存在于obj或者其父类中,则直接返回。
3) 如果attr存在是非数据描述符且存在于EX或者其父类中,则直接返回。
4)如果attr存在是属性且存在于EX或者其父类中,则直接返回。
5)如果attr在__attr__中,则直接返回。
6)抛出属性错误异常。
3,实际例子。
class myclassmethod(object):
def __init__(self, fun):
self.fun = fun
def __get__(self, obj, type):
def _excute(*args, **kwargs):
... new_args = list(args).insert(0, type)
result = self.fun(*new_args, **kwargs)
... return result
if obj == None:
returun self._excute
else:
print ‘instance is not call----‘
这样就完成了一个classmethod,同理,property,当然只读方法或者属性可以重写__set__方法。
好了,描述符就先记到这里。