Ответ действительно зависит от того, какие у вас другие намерения для 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)
).