1. 程式人生 > >day20 Pyhton學習 面向物件-成員

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