【发布时间】:2018-07-26 07:13:47
【问题描述】:
有没有办法在 Python 中定义一个既是类方法又是实例方法的方法,这样 cls 和 self 都是接收者。特别是,我希望创建一个方法,(1)知道在类上调用它时调用了哪个类(Foo.method(value)),并且(2)知道在实例上调用它时调用了哪个实例(@987654324 @)。
例如,我会设想这样的工作:
class Foo:
def __str__(self): return 'Foo()'
@classinstancemethod
def method(cls, self):
print(cls, self)
class Bar(Foo):
def __str__(self): return 'Bar()'
Foo().method() # <class '__main__.Foo'> Foo()
Bar().method() # <class '__main__.Bar'> Bar()
Foo.method(Foo()) # <class '__main__.Foo'> Foo()
Foo.method(Bar()) # <class '__main__.Foo'> Bar()
Bar.method(Foo()) # <class '__main__.Bar'> Foo()
请注意,我知道可以像Foo.foo(value) 一样调用未修饰的方法,但这不是我想要的,因为它没有得到cls 变量。如果没有cls 变量,该方法不知道它刚刚调用了哪个类。它可能被称为Bar.method(value),现在可以知道value 是否是Foo 的一个实例。未修饰的方法更像是静态方法和实例方法,而不是类方法和实例方法。
【问题讨论】:
标签: python decorator class-method