Можно ли использовать метод в качестве статического метода или метода экземпляра?
Я хотел бы иметь возможность сделать это:
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 также поддерживает обычные функции, так это определить функцию вне этого класса, а затем вызвать эту функцию из обычного метода. Звонящий может решить, какой из них нужен.