gpt4 book ai didi

python - 从类和此类的实例访问函数

转载 作者:行者123 更新时间:2023-11-28 18:48:28 25 4
gpt4 key购买 nike

有这段代码:

class B:
def f(self):
pass

print(B.f) # <function B.f at 0xb711977c>
print(B().f) # <bound method B.f of <__main__.B object at 0xb71774cc>>

解释器如何知道当从类对象访问函数 f 时返回正常函数,但是当从类实例访问此函数时返回绑定(bind)方法?我读到有一个 __get__ 函数用于将对象与函数绑定(bind),但它如何在类和类实例内部工作?

最佳答案

函数实现为 descriptors .引用文档:

In general, a descriptor is an object attribute with “binding behavior”, one whose attribute access has been overridden by methods in the descriptor protocol. Those methods are __get__(), __set__(), and __delete__(). If any of those methods are defined for an object, it is said to be a descriptor.

想法是 __get__ 方法允许识别如何获取属性。考虑这个简单的例子:

>>> class Descriptor(object):
... def __get__(self, obj, type=None):
... print '__get__(%r, %r)' % (obj, type)
...
>>> class A(object):
... desc = Descriptor()
...
>>> A.desc
__get__(None, <class '__main__.A'>)
>>> A().desc
__get__(<__main__.A object at 0x020F5B50>, <class '__main__.A'>)

如您所见,并如 __get__ documentation 中所述, obj 参数允许通过类或实例来区分属性访问。 Python 的内部可以使用相同的机制在访问函数属性时返回绑定(bind)或未绑定(bind)的方法。

实践中:

>>> class A:
... def f(self):
... pass
...
>>> A.f.__get__(None, A)
<unbound method A.f>
>>> A.f.__get__(A(), A)
<bound method A.f of <__main__.A instance at 0x022082D8>>

这是所有 Python 2.x 示例,但据我所知,除了未绑定(bind)方法是常规函数外,Python 3.x 的工作方式相同。

关于python - 从类和此类的实例访问函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16841081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com