我试图了解一下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
的默认值,并且只执行一次。调用方法时,使用的默认值是定义时计算的值。在您的案例中,
defl
与default
变量的值绑定,就像在执行Base
的类体形式期间一样。无论稍后如何调用showDefaultValue
(即,无论是通过Base
还是通过Descend
调用),该值在所有随后的showDefaultValue
调用中都保持不变。