【问题标题】:Default variable referencing own class in python在python中引用自己的类的默认变量
【发布时间】:2011-09-07 17:07:08
【问题描述】:

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

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)

【问题讨论】:

  • 类方法必须将实例变量(对象)self 作为它们的第一个变量。 99% 的情况下,您没有将类传递给外部函数,而是将实例变量(或对象)self 传递给外部函数。您对整个班级所做的事情似乎不正确。你想写@classfunction吗?或者你是否试图操纵类的对象?
  • 其实是@staticmethod
  • 不能解决你的问题,但你真的应该让test 成为一个class方法,它将cls 作为第一个参数,然后在你的调用中使用它到external_function

标签: python default-value


【解决方案1】:

这是不可能的,因为任何方法的参数定义中的任何内容,无论是静态方法还是普通方法,都会在创建类时解析并执行,在创建您尝试使用的类对象之前。此时还会评估默认值,如下面的代码所示。

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()

输出:

创建类 获取默认值 测试称为 测试称为

【讨论】:

    【解决方案2】:

    无法以这种方式重写代码。您可以做的最接近的是:

    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,或者重构你的代码以不需要它。

    【讨论】:

    • 不幸的是它是python 2(2.5或2.6)
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多