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


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

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 5

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

Зло!

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

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

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

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

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

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

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