Можно ли использовать метод в качестве статического метода или метода экземпляра?

Я хотел бы иметь возможность сделать это:

class A(object):
    @staticandinstancemethod
    def B(self=None, x, y):
        print self is None and "static" or "instance"

A.B(1,2)
A().B(1,2)

Это похоже на проблему, которая должна иметь простое решение, но я не могу придумать или найти ее.

4 ответа

Решение

Это возможно, но, пожалуйста, не надо. Я не мог не реализовать это, хотя:

class staticandinstancemethod(object):
     def __init__(self, f):
          self.f = f

     def __get__(self, obj, klass=None):
          def newfunc(*args, **kw):
               return self.f(obj, *args, **kw)
          return newfunc

... и его использование:

>>> class A(object):
...     @staticandinstancemethod
...     def B(self, x, y):
...         print self is None and "static" or "instance"

>>> A.B(1,2)
static
>>> A().B(1,2)
instance

Злой!

Исходя из того, что вы говорите, это соответствует тому, что вы ищете? Я не уверен, что есть способ сделать именно то, что вы говорите, "встроенный"

class Foo(object):
    def __init__(self, a=None, b=None):
        self.a
        self.b

    def Foo(self):
        if self.a is None and self.b is None:
            form = CreationForm()
        else: 
            form = EditingForm()
        return form

Так как вы хотите, чтобы случай статического метода использовался для создания нового класса, лучше всего сделать его обычным методом и вызвать его в конце __init__ метод.

Или, если вы этого не хотите, создайте отдельную фабричную функцию вне класса, которая будет создавать новый пустой объект и вызывать для него нужный метод.

Вероятно, есть способы сделать именно то, что вы просите, но они будут блуждать по внутренним механизмам Python, быть запутанными, несовместимыми с Python 2.x и 3.x - и я не вижу реальной необходимости в этом.

Ответ на ваш вопрос - нет, вы не можете этого сделать.

Что я хотел бы сделать, так как Python также поддерживает обычные функции, так это определить функцию вне этого класса, а затем вызвать эту функцию из обычного метода. Звонящий может решить, какой из них нужен.

Другие вопросы по тегам