让我说我有这个课程:
class Test(object):
def __init__(self, a):
self.a = a
def test(self, b):
if isinstance(self, Test):
return self.a + b
else:
return self + b
理想情况下,我的世界会这样做:
>>> Test.test(1,2)
3
>>> Test(1).test(2)
3
现在这不起作用,因为你收到这个错误:
TypeError: unbound method test() must be called with Test instance as first argument (got int instance instead)
在python3中,这个工作正常,我怀疑这可能是python2中的装饰器,但是我的python foo不够强大,无法让它工作。
Plot Twist :当我不需要静态调用时,当我需要自己的东西时会发生什么。
答案 0 :(得分:5)
如果你想要在实例上调用实际接收self
的东西,但也可以在类上调用,那么编写自己的描述符类型可能是可取的:
import types
class ClassOrInstanceMethod(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __get__(self, instance, owner):
if instance is None:
instance = owner
return self.wrapped.__get__(instance, owner)
class demo(object):
@ClassOrInstanceMethod
def foo(self):
# self will be the class if this is called on the class
print(self)
对于问题的原始版本,您可以像使用@staticmethod
一样编写任何其他静态方法。在实例上调用静态方法的作用与在类上调用它相同:
class Test(object):
@staticmethod
def test(a, b):
return a + b