在python中引用自己的类的默认变量

时间:2011-06-03 10:06:02

标签: python default-value

我正在尝试写一些类似的东西:

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)

2 个答案:

答案 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,或者重构代码以不需要这个。