day20 Pyhton學習 面向物件-成員
一.類的成員
class 類名: # 方法 def __init__(self, 引數1, 引數2....): # 屬性變數 self.屬性1 = 引數1 self.屬性2 = 引數2 .... # 方法 def method(self): pass
在上面的程式碼中__init__和method都屬於類的成員方法,又稱為例項方法.self.屬性1 = 引數1,這個程式碼的含義是給物件設定屬性資訊,又被稱為成員變數或者例項變數.
二.類的成員-變數
在類中變數分成兩大類:
1.例項變數/成員變數
2.類變數
class Person: # 類變數, 表示所有的該類的物件都共享這個變數. country= "中國" def __init__(self, name, num, birthday): # 例項變數(欄位) 表示你建立的每⼀個⼈都有這三個變數 self.name = name self.num = num self.birthday = birthday p1 = Person("alex", 18, "1840年06⽉01⽇") print(p1.name) # alex print(p1.country) #中國 p2 = Person("wusir", 28, "1894年07⽉25⽇") print(p2.name) # wusir print(p2.country) # 中國
p1 = Person("alex", 18, "1840年06⽉01⽇") p1.country = "大清" print(p1.name) print(p1.country) # 大清 p2 = Person("wusir", 28, "1894年07⽉25⽇") print(p2.name) print(p2.country) # 中國
執行p1.country = "大清"的時候,並沒有改變類中的country.而是添加了p1中的例項變數,這個例項變數只在p1中存在,在p2中不存在
通過程式來記錄當前類被建立了多少個物件.
class Foo: count= 0 def __init__(self): Foo.count += 1 print(Foo.count) # 0 Foo() Foo() Foo() print(Foo.count) # 3
好了. 來做個簡單的總結:
例項變數, 給物件用的.
類變數, 多個物件共享的. 最好是用類名來訪問. 這樣更加規範.
三.類的成員-方法
1.成員方法(例項方法)
2.靜態方法
3.類方法
1.成員方法:
class Computer: # 例項方法(成員方法) def play(self): print("我的電腦可以玩兒") c = Computer() c.play() # 物件直接去呼叫例項方法
2.靜態方法:靜態方法不需要我們給方法傳遞self. 也就是說. 當出現一個方法不需要使用到成員變數的時候. 就可以選擇使用靜態方法. 靜態方法需要我們在方法上面新增一個@staticmethod
@staticmethod def fare(): print("我的電腦非常牛B, 可以煎雞蛋")
Computer.fare() # 類名可以直接訪問的 c.fare() # 物件也可以訪問. 但最好不要這麼幹. 以便於區分靜態方法和例項方法
3.類方法. 類方法和靜態方法差不多, 只不過類方法需要在引數列表中的第一個位置預留一個位置, 通常我們給第一個引數起名字叫cls. 類方法在被呼叫的時候也不需要傳遞例項物件. 但是. 系統會自動的把類傳遞給第一個引數. 類方法在編寫的時候, 需要在類方法上面新增@classmethod
class Computer: def play(self): print("我的電腦可以玩⼉") @staticmethod def fare(): print("我的電腦⾮常⽜B, 可以煎雞蛋") @classmethod def cal(cls, a, b): print(cls) return a+b print(Computer.cal(1, 2)) # 此時會自動的把類名傳遞給類方法的第一個引數
四 類的成員-屬性
屬性其實就是通過方法改造過來的一種變數的寫法, 在方法上新增一個@property就可以 了
class Person: def __init__(self): pass @property def age(self): return 1 p = Person() age = p.age print(age)
應用場景: 我們一般儲存資料的時候, 不會儲存一個人的年齡. 因為隨著時間的推移. 每個人的年齡都時刻在改變著. 那如何儲存更加完美呢? 很簡單. 儲存出生年月日. 然後用程式來計算,你當前的年齡. 實時的. 那這個時候就需要進行相應的計算了. 而計算屬於一個功能. 當然要寫方法裡了. 但是對於年齡這個屬性而言. 他應該是一個數值. 而不是動作. 所以python就提供了這樣一種機制. 通過方法來描述一個屬性. 注意: 1. 方法引數只能有一個self 2. 方法上方要寫@property 3. 呼叫的時候, 我們不需要寫括號. 直接當成屬性變數來用就可以了. 4. 這種套路只能取值. 不能設定值
五.私有變數
class Person: def __init__(self, laopo, mimi): self.__laopo = laopo # 私有的 self.__mimi = mimi alex = Person("wusir", "他倆搞基") print(alex.__mimi) # 私有的. 誰都不能碰
程式報錯. 私有的內容是訪問不到的. 但是, 這個訪問不到是有一定的侷限性的. 比如:
class Person: def __init__(self, laopo, mimi): self.__laopo = laopo # 私有的 self.__mimi = mimi def gaosuni(self): print("大喇叭開始廣播了") return self.__mimi # 私有的內容.在他自己的方法那裡, 他可以任意的進行使用 alex = Person("wusir", "他倆搞基") mimi = alex.gaosuni() # 通過一個非私有的方法, 訪問到了他的祕密. print(mimi)
私有方法:
class Person: def __init__(self): pass def __yue(self): print("我要約會") def job(self): print("我要⼯作") # self.__yue()#在自己類中訪問自己的其他方法. 哪怕是私有的. 也是自己在用 p = Person() # Person.____yue()#報錯 # p.__yue() # 報錯 p.job()
需要注意的是, 對於私有的內容而言. 子類是無法繼承的.
class Fu: __qingfu = "情婦_⼩潘潘" class Zi(Fu): pass print(Zi.__qingfu) # 報錯
class 類名: # ⽅法 def __init__(self, 引數1, 引數2....): # 屬性變數 self.屬性1 = 引數1 self.屬性2 = 引數2 .... # ⽅法 def method(self): pass