class 類的小總結
阿新 • • 發佈:2020-07-26
一、類的變數
01、類裡面有: 類方法(例項方法):分為"靜態方法"和"類方法",還有"成員方法" 類變數(也叫靜態變數):每一個被建立的物件都有這個類變數,可以通過"obj.類變數名" 來訪問 例項變數(也叫欄位):每個物件在建立的時候,都需要__init__(self) 初始化,然後擁有這個類的例項變數 02、修改類的類變數需要用類來改變: Person.aper="修改類變數" 那麼,物件訪問這個類變數時(obj.aper),將會顯示修改後的 "修改類變數" 03、修改例項變數可以用物件來改變,但是隻針對"當前這個物件" 有用,比如:p1.name="小明",則p1.name="小", p2.name="原來的例項變數名" p2 還是顯示原來建立物件時的名字
看下面的程式碼:
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數 self.age=age Person.count+=1 def dig(self): # 例項方法或成員方法 aper="dog的你好" print("實力方法dig") print(Person.count) p1=Person("ming",12) p1.aper="你不好" # 通過物件訪問 類變數和 例項變數 print(p1.name) print(p1.aper) Person.aper="你好的啊" p2=Person("ok",24) print(p2.aper) print(Person.count) 結果顯示: ''' 0 ming 你不好 你好的啊 2 '''
002、類裡面的方法的說明
01、類裡面有: 類方法(例項方法):分為"靜態方法"和"類方法",還有"成員方法" 類變數(也叫靜態變數):每一個被建立的物件都有這個類變數,可以通過"obj.類變數名" 來訪問 例項變數(也叫欄位):每個物件在建立的時候,都需要__init__(self) 初始化,然後擁有這個類的例項變數
A、成員方法:其實就是物件能直接方法 (obj.method()) 訪問
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數 self.age=age Person.count+=1 def dig(self): # 例項方法或成員方法 aper="dog的你好" print("實力方法dig") # 訪問成員方法,也就是例項方法 dig() p1=Person("ming",45) p1.dig() # 列印: 實力方法dig
B、靜態方法(staticmethod),其實就是不用給他傳遞引數self,不需要使用成員變數,但是需要在這個方法上加上 @staticmethod 就是靜態方法了,
關於訪問靜態方法,特別提醒
一般是使用 "類名.靜態方法()" 訪問,例如下面的 Person.func() # 列印: 靜態方法 p1.func() # 物件也可以訪問. 但最好不要這麼⼲. 以便於區分靜態⽅法和例項⽅法
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數 self.age=age Person.count+=1 def dig(self): # 例項方法或成員方法 aper="dog的你好" print("實力方法dig") @staticmethod # 靜態方法,不需要傳值 def func(): print("靜態方法") # 訪問靜態方法: Person.func() # # 列印: 靜態方法
C、 類方法,在被呼叫的時候,也不需要傳遞值,但是會給其預設為一個引數 cls ,在傳遞的時候,自動將類傳遞給這個cls,同時需要在這個方法上加上 @classmethod 來說明這是一個 類方法
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數,物件可以直接訪問 self.age=age Person.count+=1 def dig(self): # 例項方法或則類方法 aper="dog的你好" print("實力方法dig") @staticmethod # 靜態方法 def func(): print("靜態方法") @classmethod def func02(cls,a,b): print("類方法的類為:",cls) return a+b p1=Person("ming",45) # 通過物件訪問 類方法,不建議使用物件反問類方法和靜態方法,這樣利於區分 實力方法和類方法,靜態方法 print(p1.func02(1,2)) # 類方法的類為: <class '__main__.Person'> 3 # 通過類訪問 類方法 print(Person.func02(2,3)) # 類方法的類為: <class '__main__.Person'> 5
003、私有變數,物件不能直接訪問
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age,addr): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數 self.age=age Person.count+=1 self.__addr=addr def dig(self): # 例項方法或則類方法 aper="dog的你好" print("實力方法dig") @staticmethod # 靜態方法 def func(): print("靜態方法") @classmethod def func02(cls,a,b): print("類方法的類為:",cls) return a+b p1=Person("小白",14,"大街一號") # 物件訪問例項變數 # 可以直接訪問 print(p1.name) # 小白 print(p1.age) # 14 # 物件訪問私有變數 # 會報錯,不能訪問 # print(p1.__addr) # AttributeError: 'Person' object has no attribute 'addr' # 類訪問私有變數 # 也不能訪問 print(Person("小黑",45,"大街34號").__addr) # AttributeError: 'Person' object has no attribute '__addr'
A、通過公共方法來訪問私有變數
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age,addr): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數 self.age=age Person.count+=1 self.__addr=addr # 定義公共方法來訪問私有變數 def gongg(self): print("公共方法訪問私有變數") return self.__addr def dig(self): # 例項方法或則類方法 aper="dog的你好" print("實力方法dig") @staticmethod # 靜態方法 def func(): print("靜態方法") @classmethod def func02(cls,a,b): print("類方法的類為:",cls) return a+b # 物件通過公共方法訪問私有變數 p1=Person("小白",14,"大街一號") print(p1.gongg()) # 列印: 公共方法訪問私有變數 大街一號 # 類通過公共方法訪問私有變數 print(Person("小黑",45,"大街34號").gongg()) # 列印: 公共方法訪問私有變數 大街34號
004、私有方法 也就是單下劃線的方法 def __func02(self): 這種。私有方法只能類中自己呼叫(方法之間互相呼叫)
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age,addr): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數 self.age=age Person.count+=1 self.__addr=addr # 定義公共方法來訪問私有變數 def gongg(self): print("公共方法訪問私有變數") return self.__addr def dig(self): # 例項方法或則類方法 aper="dog的你好" print("實力方法dig") @staticmethod # 靜態方法 def func(): print("靜態方法") @classmethod def func02(cls,a,b): print("類方法的類為:",cls) return a+b # 定義私有方法 def __func02(self): print("這個是私有方法") p1=Person("小白",14,"大街一號") # 物件訪問私有方法,無法訪問 print(p1.__func03) # 報錯:AttributeError: 'Person' object has no attribute '__func03' # 類訪問私有方法,無法訪問 print(Person.__func03) # AttributeError: type object 'Person' has no attribute '__func03'
B、同理需要訪問的話,可以定義公共的成員方法來訪問這個私有方法
class Person: count=0 aper="你好" # 這個是類變數 def __init__(self,name,age,addr): # 例項方法或則類方法 self.name=name # 例項變數,建立的物件都有這幾個變數 self.age=age Person.count+=1 self.__addr=addr # 定義公共方法來訪問私有變數 def gongg(self): print("公共方法訪問私有變數") return self.__addr def dig(self): # 例項方法或則類方法 aper="dog的你好" print("實力方法dig") @staticmethod # 靜態方法 def func(): print("靜態方法") @classmethod def func02(cls,a,b): print("類方法的類為:",cls) return a+b # 定義私有方法 def __func03(self): print("這個是私有方法") # 定義公共的開放方法來訪問這個私有方法 def open(self): return self.__func03() p1=Person("小白",14,"大街一號") # 物件通過開放方法來訪問私有方法 p1.open() # 類通過開放方法來訪問私有方法 Person("ming",45,"四號街").open()