在python中重写类变量

2024-07-05 14:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想了解一下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()

输出为:“以基为单位的默认值”

我想知道为什么“默认”字段没有被下行类过度关注。。。有没有办法覆盖它?为什么不重写?

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


Tags: 实例代码inselfdefaultbaseinitvalue
2条回答

类变量正在被覆盖。试试看

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

这种方法不起作用的原因更多地与Python对待函数的默认参数的方式有关,而不是与类属性有关。当Python定义showDefaultValue的绑定时,会计算defl的默认值,并且只执行一次。调用方法时,使用的默认值是定义时计算的值。

在您的例子中,defl被绑定到default变量的值,就像在执行Base的类体形式时一样。无论以后如何调用showDefaultValue(即,是通过Base还是通过Descend),该值在showDefaultValue的所有后续调用中都保持固定。

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)

相关问题 更多 >