albertjan
albertjan

Reputation: 7817

can a function be static and non-static in python 2

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

Answers (1)

user2357112
user2357112

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)

Demo.

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

Demo.

Upvotes: 5

Related Questions