一、什麼是類對象,實例對象java
類對象:類名
實例對象:類建立的對象spa
二、類屬性就是類對象
所擁有的屬性,它被全部類對象
的實例對象
所共有,在內存中只存在一個副本,這個和C++、Java中類的靜態成員變量有點相似。對於公有的類屬性,在類外能夠經過類對象
和實例對象
訪問.net
類屬性code
- # 類屬性
- class people:
- name="Tom" #公有的類屬性
- __age=18 #私有的類屬性
-
- p=people()
- print(p.name) #實例對象
- print(people.name) #類對象
-
- # print(p.__age) #錯誤 不能在類外經過實例對象訪問私有的類屬性
- print(people.__age) #錯誤 不能在類外同過類對象訪問私有的類屬性
實例屬性對象
- class people:
- name="tom"
-
- p=people()
- p.age=18
-
- print(p.name)
- print(p.age) #實例屬性是實例對象特有的,類對象不能擁有
-
- print(people.name)
- #print(people.age) #錯誤:實例屬性,不能經過類對象調用
也能夠將實例屬性放在構造方法中blog
- class people:
- name="tom"
- def __init__(self,age):
- self.age=age
-
- p=people(18)
-
- print(p.name)
- print(p.age) #實例屬性是實例對象特有的,類對象不能擁有
-
- print(people.name)
- # print(people.age) #錯誤:實例屬性,不能經過類對象調用
類屬性和實例屬性混合ip
- class people:
- name="tom" #類屬性:實例對象和類對象能夠同時調用
- def __init__(self,age): #實例屬性
- self.age=age
-
- p=people(18) #實例對象
- p.sex="男" #實例屬性
-
- print(p.name)
- print(p.age) #實例屬性是實例對象特有的,類對象不能擁有
- print(p.sex)
-
- print(people.name) #類對象
- # print(people.age) #錯誤:實例屬性,不能經過類對象調用
- # print(people.sex) #錯誤:實例屬性,不能經過類對象調用
# 若是在類外修改類屬性,必須經過類對象去引用而後進行修改。若是經過實例對象去引用,
# 會產生一個同名的實例屬性,這種方式修改的是實例屬性,不會影響到類屬性,而且若是經過
# 實例對象引用該名稱的屬性,實例屬性會強制屏蔽掉類屬性,即引用的是實例屬性,除非刪除了該實例屬性內存
- class Animal:
- name="Panda"
-
- print(Animal.name) #類對象引用類屬性
- p=Animal()
- print(p.name) #實例對象引用類屬性時,會產生一個同名的實例屬性
- p.name="dog" #修改的只是實例屬性的,不會影響到類屬性
- print(p.name) #dog
- print(Animal.name) #panda
-
- # 刪除實例屬性
- del p.name
- print(p.name)
- class Test:
-
- num=100 #類屬性
- def __init__(self):
- self.age=18 #實例屬性
-
- test1=Test()
- test2=Test()
- # test1.age=19
- # test2.age=20
- print(test1.num) #100
- test1.num=200 #若是經過對象去修改類屬性,那麼Python會自動給這個對象和這個類屬性相同名字的實例屬性
- print(test1.num) #200,只是修改了副本
- print(Test.num) #100
-
- del test1.num #刪除以後,仍能打印
- print(test1.num)
三、類方法get
是類對象所擁有的方法,須要用修飾器@classmethod
來標識其爲類方法,對於類方法,第一個參數必須是類對象,通常以cls
做爲第一個參數(固然能夠用其餘名稱的變量做爲其第一個參數,可是大部分人都習慣以'cls'做爲第一個參數的名字,就最好用'cls'了),可以經過實例對象和類對象去訪問。string
- class people:
- country="china"
-
- @classmethod
- def getCountry(cls):
- return cls.country
-
- p=people()
- print(p.getCountry()) #實例對象調用類方法
- print(people.getCountry()) #類對象調用類方法
類方法還有一個用途就是能夠對類屬性進行修改:
- class people:
- country="china"
-
- @classmethod
- def getCountry(cls):
- return cls.country
- @classmethod
- def setCountry(cls,country):
- cls.country=country
-
-
- p=people()
- print(p.getCountry()) #實例對象調用類方法
- print(people.getCountry()) #類對象調用類方法
-
- p.setCountry("Japan")
-
- print(p.getCountry())
- print(people.getCountry())
四、靜態方法
須要經過修飾器@staticmethod
來進行修飾,靜態方法不須要多定義參數
- class people3:
- country="china"
-
- @staticmethod
- def getCountry():
- return people3.country
-
- p=people3()
- print(p.getCountry()) #實例對象調用類方法
- print(people3.getCountry()) #類對象調用類方法
從類方法和實例方法以及靜態方法的定義形式就能夠看出來,類方法的第一個參數是類對象cls,那麼經過cls引用的一定是類對象的屬性和方法;而實例方法的第一個參數是實例對象self,那麼經過self引用的多是類屬性、也有多是實例屬性(這個須要具體分析),不過在存在相同名稱的類屬性和實例屬性的狀況下,實例屬性優先級更高。
靜態方法中不須要額外定義參數,所以在靜態方法中引用類屬性的話,必須經過類對象來引用