Может ли метод использоваться в качестве метода 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 ответа:
Это возможно, но, пожалуйста, не надо. я не мог не реализовать это, хотя:
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