gpt4 book ai didi

Python,调用 __getattribute__ 返回的方法

转载 作者:太空狗 更新时间:2023-10-30 02:39:24 25 4
gpt4 key购买 nike

如果这个问题有重复,抱歉,我没有找到它,如果有人找到,我会删除这个问题。

我有这个简单的 python 类:

class NothingSpecial:
@classmethod
def meth(cls):
print("hi!")

并尝试用不同的方式获取方法:

a = (object.__getattribute__(NothingSpecial, 'meth'))

b = (getattr(NothingSpecial, 'meth'))

问题是,如果我这样做:

b()

$hi!

是返回,但是当我返回时:

a()

TypeError: 'classmethod' object is not callable

如何执行a方法?

最佳答案

您正在绕过 descriptor protocol ,并且您有一个未绑定(bind)的类方法。

解决方案是调用协议(protocol),如果有 __get__ method礼物:

if hasattr(a, '__get__'):
a = a.__get__(None, NothingSpecial)
a()

现在 classmethod 已绑定(bind)到该类并且它再次起作用:

>>> a.__get__(None, NothingSpecial)
<bound method NothingSpecial.meth of <class '__main__.NothingSpecial'>>
>>> a.__get__(None, NothingSpecial)()
hi!

或者,使用正确的 __getattribute__,它实际上知道如何将描述符协议(protocol)应用于类属性;类不使用 object.__getattribute__,而是使用 type.__getattribute__:

>>> type.__getattribute__(NothingSpecial, 'meth')
<bound method NothingSpecial.meth of <class '__main__.NothingSpecial'>>

您实际上想要访问 type(NothingSpecial).__getattribute__ 以允许元类在这里覆盖 __getattribute__ 的实现。

关于Python,调用 __getattribute__ 返回的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44636368/

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