我有一个接受函数的类成员:
class A:
def func(self, method):
...
我想设置一个默认方法,因为99%的时间都需要这种行为。 此默认行为是静态的,因为它不依赖于类的任何成员。但是,我希望这个默认方法是私有的,对用户是不可见的。有什么方法可以实现吗?
这就是我的尝试:
class A:
@staticmethod
def __meth(x):
pass
def func(self, method = meth):
pass
错误:'staticmethod' object is not callable
class A:
@staticmethod
def __meth(x):
pass
def func(self, method = A.__meth):
pass
错误:NameError: name 'A' is not defined
class A:
@staticmethod
def __meth(x):
pass
def func(self, method = self.__meth):
pass
错误:NameError: name 'self' is not defined
我使用的是Python 3.5,并且不想依赖更新的功能。
答案 0 :(得分:3)
使用None
作为默认值并根据需要分配它是相当惯用的:
class A:
@staticmethod
def __meth(x):
print(x)
def func(self, method=None):
if method is None:
method = self.__meth
method("x")
答案 1 :(得分:2)
问题始于您的默认参数。在读取类定义时会评估这些参数,因此尚未定义类A
。
你应该像普通的默认参数一样处理它:
class A:
@staticmethod
def __meth(x):
print('meth')
def func(self, method = None):
if method is None:
self.__meth(1)
else:
method()
def foo():
print('foo')
a = A()
a.func()
a.func(foo)
输出:
meth
foo
答案 2 :(得分:2)
您可以将名称解析延迟到lambda:
class A:
@staticmethod
def __meth(x):
pass
def func(self, method = lambda s: A.__meth(s)):
pass