python class attribute

后端 未结 3 1335
悲&欢浪女
悲&欢浪女 2020-11-27 20:05

i have a question about class attribute in python.

class base :
    def __init__ (self):
        pass
    derived_val = 1

t1 = base()
t2 = base ()

t2.deriv         


        
相关标签:
3条回答
  • 2020-11-27 20:36

    Another way (perhaps a more concise one) to demonstrate this:

    class A():
       a1 = []
    x = A()
    y = A()
    x.a1.append("test")
    x.a1, y.a1
    (['test'], ['test'])
    
    class B():
       b1 = None
       def __init__(self):
          self.b1 = list()
    r = B()
    s = B()
    r.b1.append("test")
    r.b1, s.b1
    (["test"], [])
    
    0 讨论(0)
  • 2020-11-27 20:41

    Check it out here and here.

    The __class__ attribute is the class that the object belongs to. So in your example, the situation is similar to static variables. The t2.__class__.derived_val is referring to the variable that belongs to the class, not the variable that belongs to t2.

    0 讨论(0)
  • 2020-11-27 20:56

    There are class attributes, and instance attributes. When you say

    class base :
        derived_val = 1
    

    You are defining a class attribute. derived_val becomes a key in base.__dict__.

    t2=base()
    print(base.__dict__)
    # {'derived_val': 1, '__module__': '__main__', '__doc__': None}
    print(t2.__dict__)
    # {}
    

    When you say t2.derived_val Python tries to find 'derived_val' in t2.__dict__. Since it is not there, it looks if there is a 'derived_val' key in any of t2's base classes.

    print(t2.derived_val)
    print(t2.__dict__)
    # 1
    # {}
    

    But when you assign a value to t2.derived_val, you are now adding an instance attribute to t2. A derived_val key is added to t2.__dict__.

    t2.derived_val = t2.derived_val+1
    print(t2.derived_val)
    print(t2.__dict__)
    # 2
    # {'derived_val': 2}
    

    Note that at this point, there are two derived_val attributes, but only the instance attribute is easily accessible. The class attribute becomes accessible only through referencing base.derived_val or direct access to the class dict base.__dict__.

    0 讨论(0)
提交回复
热议问题