Python中的類屬性、實例屬性與類方法、靜態方法

一、什麼是類對象,實例對象java

類對象:類名
實例對象:類建立的對象spa

二、類屬性就是類對象所擁有的屬性,它被全部類對象實例對象所共有,在內存中只存在一個副本,這個和C++、Java中類的靜態成員變量有點相似。對於公有的類屬性,在類外能夠經過類對象實例對象訪問.net

類屬性code

 

[java]  view plain  copy
 
  1. # 類屬性  
  2. class people:  
  3.     name="Tom"    #公有的類屬性  
  4.     __age=18      #私有的類屬性  
  5.   
  6. p=people()  
  7. print(p.name)   #實例對象  
  8. print(people.name)  #類對象  
  9.   
  10. # print(p.__age)    #錯誤 不能在類外經過實例對象訪問私有的類屬性  
  11. print(people.__age) #錯誤 不能在類外同過類對象訪問私有的類屬性  

 

 

實例屬性對象

 

[java]  view plain  copy
 
  1. class people:  
  2.     name="tom"  
  3.   
  4. p=people()  
  5. p.age=18  
  6.   
  7. print(p.name)  
  8. print(p.age)    #實例屬性是實例對象特有的,類對象不能擁有  
  9.   
  10. print(people.name)  
  11. #print(people.age)  #錯誤:實例屬性,不能經過類對象調用  

 

也能夠將實例屬性放在構造方法中blog

 

[java]  view plain  copy
 
  1. class people:  
  2.     name="tom"  
  3.     def  __init__(self,age):  
  4.         self.age=age  
  5.   
  6. p=people(18)  
  7.   
  8. print(p.name)  
  9. print(p.age)    #實例屬性是實例對象特有的,類對象不能擁有  
  10.   
  11. print(people.name)  
  12. # print(people.age)  #錯誤:實例屬性,不能經過類對象調用  

 

 

類屬性和實例屬性混合ip

 

[java]  view plain  copy
 
  1. class people:  
  2.     name="tom"      #類屬性:實例對象和類對象能夠同時調用  
  3.     def  __init__(self,age):    #實例屬性  
  4.         self.age=age  
  5.   
  6. p=people(18)    #實例對象  
  7. p.sex="男"       #實例屬性  
  8.   
  9. print(p.name)  
  10. print(p.age)    #實例屬性是實例對象特有的,類對象不能擁有  
  11. print(p.sex)  
  12.   
  13. print(people.name)  #類對象  
  14. # print(people.age)  #錯誤:實例屬性,不能經過類對象調用  
  15. # print(people.sex)  #錯誤:實例屬性,不能經過類對象調用  



 


# 若是在類外修改類屬性,必須經過類對象去引用而後進行修改。若是經過實例對象去引用,
# 會產生一個同名的實例屬性,這種方式修改的是實例屬性,不會影響到類屬性,而且若是經過
# 實例對象引用該名稱的屬性,實例屬性會強制屏蔽掉類屬性,即引用的是實例屬性,除非刪除了該實例屬性內存

 

 

[java]  view plain  copy
 
  1. class Animal:  
  2.     name="Panda"  
  3.   
  4. print(Animal.name)  #類對象引用類屬性  
  5. p=Animal()  
  6. print(p.name)       #實例對象引用類屬性時,會產生一個同名的實例屬性  
  7. p.name="dog"        #修改的只是實例屬性的,不會影響到類屬性  
  8. print(p.name)         #dog  
  9. print(Animal.name)    #panda  
  10.   
  11. # 刪除實例屬性  
  12. del p.name  
  13. print(p.name)  

 

 

 

[java]  view plain  copy
 
  1. class Test:  
  2.   
  3.     num=100 #類屬性  
  4.     def __init__(self):  
  5.         self.age=18     #實例屬性  
  6.   
  7. test1=Test()  
  8. test2=Test()  
  9. # test1.age=19  
  10. # test2.age=20  
  11. print(test1.num)    #100  
  12. test1.num=200       #若是經過對象去修改類屬性,那麼Python會自動給這個對象和這個類屬性相同名字的實例屬性  
  13. print(test1.num)    #200,只是修改了副本  
  14. print(Test.num)     #100  
  15.   
  16. del test1.num        #刪除以後,仍能打印  
  17. print(test1.num)  

 


三、類方法get

 

是類對象所擁有的方法,須要用修飾器@classmethod來標識其爲類方法,對於類方法,第一個參數必須是類對象,通常以cls做爲第一個參數(固然能夠用其餘名稱的變量做爲其第一個參數,可是大部分人都習慣以'cls'做爲第一個參數的名字,就最好用'cls'了),可以經過實例對象和類對象去訪問。string

[java]  view plain  copy
 
  1. class people:  
  2.     country="china"  
  3.   
  4.     @classmethod  
  5.     def getCountry(cls):  
  6.         return cls.country  
  7.   
  8. p=people()  
  9. print(p.getCountry())   #實例對象調用類方法  
  10. print(people.getCountry())  #類對象調用類方法  



類方法還有一個用途就是能夠對類屬性進行修改:

 

[java]  view plain  copy
 
  1. class people:  
  2.     country="china"  
  3.   
  4.     @classmethod  
  5.     def getCountry(cls):  
  6.         return cls.country  
  7.     @classmethod  
  8.     def setCountry(cls,country):  
  9.         cls.country=country  
  10.   
  11.   
  12. p=people()  
  13. print(p.getCountry())   #實例對象調用類方法  
  14. print(people.getCountry())  #類對象調用類方法  
  15.   
  16. p.setCountry("Japan")  
  17.   
  18. print(p.getCountry())  
  19. print(people.getCountry())  


 

四、靜態方法

 

須要經過修飾器@staticmethod來進行修飾,靜態方法不須要多定義參數

 

[java]  view plain  copy
 
  1. class people3:  
  2.     country="china"  
  3.   
  4.     @staticmethod  
  5.     def getCountry():  
  6.         return people3.country  
  7.   
  8. p=people3()  
  9. print(p.getCountry())   #實例對象調用類方法  
  10. print(people3.getCountry())  #類對象調用類方法  

 


從類方法和實例方法以及靜態方法的定義形式就能夠看出來,類方法的第一個參數是類對象cls,那麼經過cls引用的一定是類對象的屬性和方法;而實例方法的第一個參數是實例對象self,那麼經過self引用的多是類屬性、也有多是實例屬性(這個須要具體分析),不過在存在相同名稱的類屬性和實例屬性的狀況下,實例屬性優先級更高。

 

靜態方法中不須要額外定義參數,所以在靜態方法中引用類屬性的話,必須經過類對象來引用

相關文章
相關標籤/搜索