python描述器descriptor_Python描述器descriptor详解

前面说了descriptor,这个东西其实和Java的setter,getter有点像。但这个descriptor和上文中我们开始提到的函数方法这些东西有什么关系呢?

所有的函数都可以是descriptor,因为它有__get__方法。

代码如下:

>>> def hello():

pass

>>> dir(hello)

['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__

', '__getattribute__',

'__hash__', '__init__', '__module__', '__name__', '__new__',

'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure',

'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

>>>

注意,函数对象没有__set__和__del__方法,所以它是个non-data descriptor.

方法其实也是函数,如下:

代码如下:

>>> class T(object):

def hello(self):

pass

>>> T.__dict__['hello']

>>>

或者,我们可以把方法看成特殊的函数,只是它们存在于类 中,获取函数属性时,返回的不是函数本身(比如上面的),而是返回函数的__get__方法的返回值,接着上面类T的定义:

>>> T.hello   获取T的hello属性,根据查找策略,从T的__dict__中找到了,找到的是,但不会直接返回,因为它有__get__方法,所以返回的是调用它的__get__(None, T)的结果:一个unbound方法。

>>> f = T.__dict__['hello']   #直接从T的__dict__中获取hello,不会执行查找策略,直接返回了

代码如下:

>>> f

>>> t = T()

>>> t.hello                     #从实例获取属性,返回的是调用的__get__(t, T)的结果:一个bound方法。

代码如下:

>

>>>

为了证实我们上面的说法,在继续下面的代码(f还是上面的):

代码如下:

>>> f.__get__(None, T)

>>> f.__get__(t, T)

>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值