python 类和对象的属性
python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象。
1. 父类的对象属性会被子类的对象继承。
2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性,父类和子类的类属性都会被改变。
3. 子类继承父类的类属性可以通过类名+属性名使用,但是一旦发生赋值,就会新定义一个相同名字的子类自己的类属性。
4. 类的对象可以通过对象名+属性名使用类属性,但是一旦发生赋值,就会新定义一个相同名字的对象属性,而且不会被继承。
eg:
>>> class A(object): ... value = 1 #类属性 ... def __init__(self): ... self.value2 = 2 # 对象属性 ... >>> a = A() >>> print a.__dict__ {'value2': 2} >>> print A.__dict__ {'__module__': '__main__', 'value': 1, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None, '__init__': <function __init__ at 0x10fcd1de8>} >>> a.value = 2 #新定义了的对象属性,不再是A的类属性 >>> A.value 1 >>> print a.__dict__ {'value2': 2, 'value': 2} >>> class B(A): ... value_B = 3 ... >>> b = B() >>> print b.__dict__ {'value2': 2} >>> print B.__dict__ {'__module__': '__main__', '__doc__': None, 'value_B': 3} >>> B.value 1 >>> B.value = 5 #新定义了B的类属性,不再是继承自A的类属性。 >>> A.value 1 >>> print B.__dict__ {'__module__': '__main__', '__doc__': None, 'value': 5, 'value_B': 3} >>>
注意:Python中的属性是分层定义的,当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现再不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。