статический метод как параметр по умолчанию для метода класса - PullRequest
4 голосов
/ 19 октября 2010

Мой вопрос касается двух ответов на другой вопрос: Использование классов / статических методов в качестве значений параметров по умолчанию в методах того же класса .

Я пытаюсь понять, действительно ли существует разница между тем, что делают два ответа, и если да, то в чем плюсы и минусы каждого.

Вопрос: как использовать метод класса в качестве параметра по умолчанию для метода в том же классе.

Ответ 1: использовать функцию вместо метода класса

class X:
    def default_func(x):
        return True

    def test(self, func = default_func):
        return func(self)

Ответ 2: использовать метод класса, но преобразовать его в функцию

def unstaticmethod(static):
    return static.__get__(None, object)

class X:
    @staticmethod
    def default_func(x):
        return True

    def test(self, func = unstaticmethod(default_func)):
        return func(self)

Первоначально он был написан на Python 2, но мое резюме (надеюсь) Python 3.

1 Ответ

3 голосов
/ 27 января 2011

Ответ действительно зависит от того, какие у вас другие намерения для X.default_func. Если вы намерены вызывать X.default_func вне экземпляра X, то вы хотите, чтобы это был статический метод (Ответ 2).

# in other code...
some_object = "Bring out your dead"
X.default_func(some_object)

Если, с другой стороны, вы не ожидаете, что default_func когда-либо будет вызван, кроме как в экземпляре X (и, конечно, используется по умолчанию для test), я бы переписал Ответ 1, чтобы правильный метод (и использовать соглашение self).

class X:
    def default_func(self):
        return True

    def test(self, func = default_func):
        return func(self)

В качестве дополнительного примечания я хотел бы отметить, что вы могли бы написать Ответ 2 по-другому, чтобы избежать нестатического метода:

class X:
    def default_func(x):
        return True

    def test(self, func = default_func):
        return func(self)

    default_func = staticmethod(default_func)

Причина, по которой это работает, заключается в том, что класс X не создается (и default_func не становится методом X) до тех пор, пока не будет обработан весь блок под class X: (включая аргумент по умолчанию для test(func)).

...