Reputation: 7817
Lets say I have this class:
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
This would ideally in my world do this:
>>> Test.test(1,2)
3
>>> Test(1).test(2)
3
Now this doesn't work because you get this error:
TypeError: unbound method test() must be called with Test instance as first argument (got int instance instead)
In python3 this works fine, and I have the sneaking suspicion this is possible with a decorator in python2 but my python foo isn't strong enough to get that to work.
Plot Twist: So what happens when I need something on self when it's not called statically.
Upvotes: 0
Views: 375
Reputation: 281528
If you want something that will actually receive self
if called on an instance, but can also be called on the class, writing your own descriptor type may be advisable:
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)
For the original version of your question, you could just write it like any other static method, with @staticmethod
. Calling a static method on an instance works the same as calling it on the class:
class Test(object):
@staticmethod
def test(a, b):
return a + b
Upvotes: 5