Overriding class variables in python

后端 未结 2 1788
滥情空心
滥情空心 2021-02-19 05:09

I\'m trying to understand a bit how Python (2.6) deals with class, instances and so on, and at a certain point, I tried this code:

#/usr/bin/python2.6

class Bas         


        
相关标签:
2条回答
  • 2021-02-19 05:38

    The class variable is being overwritten. Try

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

    The reason your way doesn't work has more to do with the way Python treats default arguments to functions than with class attributes. The default value for defl is evaluated at the time Python defines the binding for showDefaultValue and this is done exactly once. When you call your method the default value used is what was evaluated at the time of definition.

    In your case, defl was bound to the value of the default variable as it was during the execution of the class body form of Base. Regardless of how you call showDefaultValue later on (i.e., whether via Base or via Descend) that value remains fixed in all subsequent invocations of showDefaultValue.

    0 讨论(0)
  • 2021-02-19 05:40
    def showDefaultValue(cls, defl=default):
    

    means that default gets evaluated when the function is defined, as usual in Python. So the definition looks like this then:

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

    This value of defl is stored as a default argument on the function object and used when you call the method without arguments. You can look at the defaults of a function like print Descend.showDefaultValue.im_self.default to validate this.

    If you want to get the default from the current class then you have get it from there:

    @classmethod
    def showDefaultValue(cls, defl=None):
        if defl is None:
            defl = cls.default
        print "defl == %s" % (defl)
    
    0 讨论(0)
提交回复
热议问题