我正在尝试写一些类似的东西:
class MyClass(object):
@staticmethod
def test(x, y, z=None):
if not z:
z = external_function(MyClass)
是否可以在python中将其重写为:
class MyClass(object):
@staticmethod
def test(x, y, z=external_function(MyClass)):
pass
(第二个代码不起作用,因为它引用了此时未定义的MyClass)
答案 0 :(得分:3)
这是不可能的,因为任何方法的参数定义中的任何内容,无论是静态方法还是普通方法,都是在创建类的对象之前在类创建时解析和执行的。此时也会评估默认值,如下面的代码所示。
def say_hi():
print "Getting default value"
class MyClass(object):
print "Creating class"
@staticmethod
def test(a=say_hi()):
print "test called"
MyClass.test()
MyClass.test()
输出:
Creating class Getting default value test called test called
答案 1 :(得分:3)
无法以这种方式重写代码。你能做的最接近的是:
class MyClass:
pass
def test(x, y, z=external_function(MyClass):
pass
MyClass.test = staticmethod(test)
del test
请注意,这假定Python 3;在Python 2中,您可能需要摆弄new
模块。但尽管这是可能的,但代码的意图非常明显。最好坚持if z is None
,或者重构代码以不需要这个。