基础知识回顾:属性

Posted Ryana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础知识回顾:属性相关的知识,希望对你有一定的参考价值。

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中属性是按照从下到上的顺序来查找;当删除实例属性后,再使用相同的名称,访问到的将是类属性。

 

以上是关于基础知识回顾:属性的主要内容,如果未能解决你的问题,请参考以下文章

VUE基础回顾6

面向对象知识点回顾整理

Java知识系统回顾整理01基础02面向对象02属性

动态SQL基础概念复习(Javaweb作业5)

Java基础回顾

第248天学习打卡(知识点回顾 xml注入集合属性 FactoryBean bean生命周期)