当通过实例本身而不是类进行调用时,是否可以在 Python @classmethod 注释函数中访问对象实例?
class Foo(object):
def __init__(self, text):
self.text = text
@classmethod
def bar(cls):
return None
print(Foo.bar())
foo = Foo('foo')
# If possible, I'd like to return "foo"
print(foo.bar())
我正在解决一个库的限制,该库通过实例(而不是类)调用类方法,并希望能够以某种方式解决我只能访问类的事实bar(cls)
(我必须访问实例才能访问.text
)。我认为这是不可能的,但我想我会问(对于这样一个小众的请求,我在互联网上也找不到任何东西)。
一种可能的无需修改的方法
Foo
是将其定义bar
为子类的实例方法,但使用自定义描述符使对该方法的属性访问返回超类的同名类方法,而不是当从类访问该属性时,当传递给的实例__get__
是None
:演示:https://ideone.com/yVAzr3
编辑:由于您现在已经在评论中澄清了您对拥有完全控制权
Foo
,因此您可以直接修改Foo.bar
它,使其成为一个自定义描述符,其__get__
方法根据上述条件调用类方法或实例方法。为了方便起见,我将描述符作为一个装饰器,该装饰器使用
instancemethod
可以装饰实例方法的附加方法来装饰类方法:演示:https://ideone.com/PmSnUC