前言
python類與實例的方法的調(diào)用中覺得云里霧里,思考之后將自己的想法記錄下,一來加深自己理解,鞏固自己記憶,而來幫助一些想要學(xué)習(xí)python的朋友理解這門抽象的語言,由于Python是動態(tài)語言,類以及根據(jù)類創(chuàng)建的實例可以任意綁定屬性以及方法,下面分別介紹。
1.類綁定屬性
類綁定屬性可以直接在class中定義屬性,這種屬性是類屬。
1
2
|
class Student( object ): name = 'Student' |
這個屬性雖然歸類所有,但類的所有實例都可以訪問到。
1
2
3
4
5
6
7
|
class Student( object ): name = 'Student' s = Student() # 創(chuàng)建實例s print (s.name) # 打印name屬性,因為實例并沒有name屬性,所以會繼續(xù)查找class的name屬性 print (Student.name) # 打印類的name屬性 Student Student |
此時如果修改s.name的值,會有如下結(jié)果:
1
2
3
4
5
|
s.name = 'xiaoming' # 給實例綁定name屬性 print (s.name) # 由于實例屬性優(yōu)先級比類屬性高,因此,它會屏蔽掉類的name屬性 print (Student.name) # 但是類屬性并未消失,用Student.name仍然可以訪問 xiaoming Student |
接下來刪除s.name屬性:
1
2
3
|
del s.name # 如果刪除實例的name屬性 print (s.name) # 再次調(diào)用s.name,由于實例的name屬性沒有找到,類的name屬性就顯示出來了 Student |
由此可見相同名稱的實例屬性將覆蓋類屬性,刪除實例屬性后,實例將向上訪問到類屬性。
2.實例綁定屬性
實例綁定屬性的方法有兩種,一是通過類的self變量,二是直接給實例賦值。
1
2
3
4
5
|
class Student( object ): def __init__( self , name): self .name = name s = Student( 'Bob' ) #方法一 通過類的self變量綁定屬性 s.score = 90 #方法二 直接賦值 |
3.類綁定方法
類綁定方法分兩種,第一種形如類綁定屬性,例程如下:
1
2
3
4
5
6
7
8
9
10
11
|
Class Student( object ): pass a = Student() #創(chuàng)建實例 def set_score( self ,score): self .score = score Student.set_score = set_score #類綁定方法 a.set_score( 99 ) #調(diào)用方法 a.score 99 #輸出 |
第二種是使用MethodType給類綁定方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Class Student( object ): pass a = Student() #創(chuàng)建實例 def set_score( self ,score): self .score = score from types import MethodType Student.set_score = MethodType(set_score, Student) a.set_score( 99 ) #調(diào)用方法 a.score 99 #輸出 |
這種方法有一個需要注意的地方,如果繼續(xù)創(chuàng)建一個實例b:
1
2
3
4
5
|
b = Student() b.set_score( 60 ) b.score a.score 60 |
會發(fā)現(xiàn)a的屬性score值也變成60。這里個人的理解是這里的score并不是同上一種方法一樣直接綁定在類,而是類似于像列表一樣的共享引用的關(guān)系,
即實例a和b都引用這個score作為自己的屬性,而當(dāng)其被修改時,所有引用它的實例的對應(yīng)屬性都將一同發(fā)生變化。
4.實例綁定方法
第一種通過給類綁定方法,可以使實例調(diào)用,如上所示。
第二種是使用MethodType給單個實例綁定方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Class Student( object ): pass a = Student() #創(chuàng)建實例 def set_score( self ,score): self .score = score from types import MethodType a.set_score = MethodType(set_score, a) a.set_score( 99 ) #調(diào)用方法 a.score 99 #輸出 |
注意這種方式只對實例a起作用,如果需要類Studnet的所有實例均可調(diào)用,那么直接給類Student綁定方法即可。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
原文鏈接:http://www.cnblogs.com/seirios1993/p/6624157.html