Можно ли использовать метод в качестве статического метода или метода экземпляра? - PullRequest
5 голосов
/ 28 апреля 2011

Я бы хотел сделать это:

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 ]

9 голосов
/ 28 апреля 2011

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

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

Зло!

0 голосов
/ 28 апреля 2011

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

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
0 голосов
/ 28 апреля 2011

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

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

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

0 голосов
/ 28 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...