Python一切皆对象(object),每个对象都可能有多个属性(attribute)。其属性可能来自类定义或类继承,这叫类属性,也可能来自实例对象的属性,这叫实例属性。
不同实例的实例属性可能不同,不同实例的类属性都相同。所以一般把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。
属性
定义属性:类.属性 = 值 或者 实例.属性 = 值
调用属性:类().属性() 或者 实例.属性() 或者 实例.属性
1 >>> class Person: 2 def think(self): 3 print "To be or not to be is a question" 4 5 >>> class Women(Person): 6 def gender(self): 7 print "she may be a girl or a lady" 8 9 10 >>> Ryana = Women() #实例化一个子类Women对象Ryana 11 >>> Ryana.think() #通过实例.属性()调用 12 To be or not to be is a question 13 >>> Women().gengder() #通过类().属性()调用,类()等价于类实例 14 she may be a girl or a lady 15 >>> Ryana.age = 18 #定义实例属性 16 >>> Person.speak = ‘hello‘ #类之外,定义类属性 17 >>> Ryana.speak #注意没有(),因为调用的是类的字符串属性,不是类方法 18 ‘hello‘ 19 >>> Person.__dict__ 20 {‘__module__‘: ‘__main__‘, ‘speak‘: ‘hello‘, ‘think‘: <function think at 0x03DEDEF0>, ‘__doc__‘: None} 21 >>> women.__dict__ 22 {‘gengder‘: <function gengder at 0x03DEDF30>, ‘__module__‘: ‘__main__‘, ‘__doc__‘: None} 23 >>> Ryana.__dict__ 24 {‘age‘: 18} 25 >>> Echo = Person() #实例化一个父类Person对象Echo 26 >>> Echo.think() 27 To be or not to be is a question 28 >>> Echo.speak 29 ‘hello‘ 30 >>> Echo.gender #类的继承方式由下到上 31 32 Traceback (most recent call last): 33 File "<pyshell#20>", line 1, in <module> 34 Echo.gengder 35 AttributeError: Person instance has no attribute ‘gender‘ 36 >>> Echo.__dict__ 37 {}
查询类或对象的属性除了访问类的字典属性 __dict__,还可以用内建函数dir()查看类或者对象的所有属性。
>>> dir(Person) [‘__doc__‘, ‘__module__‘, ‘speak‘, ‘think‘] >>> dir(Women) [‘__doc__‘, ‘__module__‘, ‘gengder‘, ‘speak‘, ‘think‘]
从上面的属性可知,除了类自定义的属性,还有__doc__,__module__,这类属性称为特殊属性,常见的特殊属性有:
1 >>> women.__bases__ #类的所有父类构成的元组 2 (<class __main__.Person at 0x03834ED8>,) 3 >>> women.__doc__ #类的文档字符串 4 >>> women.__name__ #类的名字(字符串) 5 ‘women‘ 6 >>> women.__module__ #类定义所在的模块 7 ‘__main__‘ 8 >>> Ryana.__class__ #实例对应的类 9 <class __main__.women at 0x03C7A5E0>
类属性与实例属性冲突
1 >>> class f: 2 a = 10 3 4 #实例化对象obj1和obj2从类f继承属性a 5 >>> obj1 = f() 6 >>> obj2 = f() 7 >>> print obj1.a , obj2.a , f.a 8 10 10 10 9 10 #实例化对象obj1自定义实例属性obj1.a = 12 11 >>> obj1.a = obj1.a + 2 #等价于obj1.a += 2 12 >>> print obj1.a , obj2.a , f.a 13 12 10 10 14 15 #改变类f的属性,由于对象obj1的实例属性a和类f的类属性a命名冲突,所以对象obj1将屏蔽类属性 16 >>> f.a = f.a + 3 17 >>> print obj1.a , obj2.a , f.a 18 12 13 13
Python中属性是按照从下到上的顺序来查找;当删除实例属性后,再使用相同的名称,访问到的将是类属性。
时间: 2024-11-04 17:13:29