我试图了解一下Python(2.6)是如何处理类、实例等问题的,在某一点上,我尝试了以下代码:

#/usr/bin/python2.6

class Base(object):
    default = "default value in base"

    def __init__(self):
        super(Base, self).__init__()

    @classmethod
    def showDefaultValue(cls, defl = default):
        print "defl == %s" % (defl)


class Descend(Base):
    default = "default value in descend"

    def __init__(self):
        super(Descend, self).__init__()

if __name__ == "__main__":
    Descend.showDefaultValue()

输出为:“基础中的默认值”
我想知道为什么“默认”字段不会被Descend类覆盖…有什么方法可以覆盖它吗?为什么它没有被覆盖?
任何提示(或链接到解释性页面将不胜感激)。谢谢您!

最佳答案

正在覆盖类变量。尝试

@classmethod
def showDefaultValue(cls):
    print "defl == %s" % (cls.default,)

您的方法不起作用的原因与Python处理函数默认参数的方式比处理类属性的方式有更多的关系。当python为defl定义绑定时,会计算showDefaultValue的默认值,并且只执行一次。调用方法时,使用的默认值是定义时计算的值。
在您的案例中,defldefault变量的值绑定,就像在执行Base的类体形式期间一样。无论稍后如何调用showDefaultValue(即,无论是通过Base还是通过Descend调用),该值在所有随后的showDefaultValue调用中都保持不变。

09-30 19:46