覆盖python中的类变量

时间:2011-01-21 20:59:06

标签: python oop inheritance class-design

我试图理解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类覆盖......有没有办法覆盖它?为什么不被覆盖?

任何提示(或解释性页面的链接将不胜感激)。谢谢!

2 个答案:

答案 0 :(得分:12)

正在覆盖类变量。试试

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

你的方式不起作用的原因更多地与Python处理函数的默认参数而不是类属性的方式有关。 defl的默认值在Python定义showDefaultValue的绑定时进行评估,这只完成一次。调用方法时,使用的默认值是定义时计算的值。

在您的情况下,defl绑定到default变量的值,就像执行Base的类体形式时一样。无论您稍后如何致电showDefaultValue(即,是通过Base还是通过Descend),该值在showDefaultValue的所有后续调用中都会保持不变。

答案 1 :(得分:12)

def showDefaultValue(cls, defl=default):

表示在定义函数时会对default进行求值,就像在Python中一样。所以定义如下:

def showDefaultValue(cls, defl="default value in base"):

defl的值作为默认参数存储在函数对象上,并在调用不带参数的方法时使用。您可以查看print Descend.showDefaultValue.im_self.default之类的函数的默认值来验证这一点。

如果你想从当前的班级获得默认值,那么你可以从那里得到它:

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