1. 程式人生 > >20180727 (面向對象的屬性 類方法和靜態方法)

20180727 (面向對象的屬性 類方法和靜態方法)

python 復用性 減少 整體 調用 參數 空間 遇到 @property

一.屬性:將一個方法,偽裝成一個屬性,在代碼的級別上沒有本質的提升,但是可以讓其看起來更合理

property:類似於bmi這種,看起來像名詞,實際是需要計算的(動詞),或者遇到周長或者面積這種詞的時候,需要使用property裝飾器來對其進行偽裝

例如: 

class Person:
def __init__(self,name,weight,height):
self.name = name
self.weight = weight
self.height = height
def bmi(self): 此時bmi按常理會認為他是一個名詞.然而在這裏確實當做動詞再用,所以不太合理

return round(self.weight / self.height ** 2,2)
p1 = Person("劉某某",60,1.7)
print(p1.bmi())

例如:

class Person:
def __init__(self,name,weight,height):
self.name = name
self.weight = weight
self.height = height
@property ====>此時使用這個裝飾器的主要作用是將bmi方法偽裝成一個屬性,就是把它當做一個名詞來看

def bmi(self):
return round(self.weight / self.height ** 2,2)
p1 = Person("劉某某",60,1.7)
print(p1.bmi)

屬性的修改:

例如:

class Person:
def __init__(self,name,age):
self.name = name
self.__age = age
@property
def age(self):
return self.__age
@age.setter =====>這個裝飾器在這裏是可以修改年齡這個對象值

def age(self,a1):
print(a1)
p1 = Person("劉某某",22)
p1.age = 21 (修改年齡)

屬性的刪除:

例如:

class Person:
def __init__(self,name,age):
self.name = name
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self,a1):
print(a1)
@age.deleter =====>這個裝飾器在這裏是可以刪除年齡這個屬性
def age(self):
del self.__age
p1 = Person("劉某某",22)
p1.age = 21
del p1.age (刪除年齡這個屬性)
print(p1.__dict__)

二.類方法

類方法:通過類名調用的方法,類方法中第一個參數約定俗成cls,python自動將類名(類空間)傳給cls

普通方法與類方法的區別:

例如:

class A:
def func(self):
print(self) 普通方法 : 由對象調用,至少一個self參數,執行普通方法的時候,自動將調用該方法的對象賦值給self
@classmethod
def func(cls): 類方法 : 由類調用,至少一個cls參數,執行類方法的時候,自動將調用該方法的類賦值給cls
print(cls)
a1 = A()
a1.func() 對象調用方法,cls最終的到的是該類本身

類方法的應用場景

(1)類中有些方法是不需要對象參與 (只能有類名調用(對象調用)傳給cls參數的也是該對象的所屬)類)

例如:

class A:
name = "alex"
count = 1
@classmethod 此方法無需對象參與
def func(cls):
return cls.name + str(cls.count + 1)
#A.func(111) =====>(不要用類名去調用類裏面的方法,除了類方法和靜態方法)
a1 = A()
print(a1.func())

(2)在類中的靜態變量進行改變,要用到類方法

(3)繼承中,父類得到子類的類空間 (子類通過類名去執行父類中的類方法,並將本子類的類名空間傳給了父類,並且可以對子類中的所有內容進行修改)
例如:

class A:
age = 12
@classmethod =====>類方法在這裏接收到的是一個類空間,哪個類調用的,就是哪個類的類空間
def func(cls):
     cls.age = 25

return cls.age
class B(A):
age = 22
a1 = B()
print(a1.func()) =====>25

例如:不通過類方法,想讓父類的某個方法得到子類的類空間裏面的任意值

class A:
age = 12
def func(self):
print(self) =====>self是B類實例化的一個對象,能得到子類空間的任意值,但是只能訪問,不能修改
class B(A):
age = 22
b1 = B()
b1.func()

三.靜態方法

靜態方法的好處:(1)代碼塊是一個整體 分類整理 是代碼看起來清晰明了

        (2)復用性 減少代碼量 (比如父類A下面有100個子類,這100個子類都可以調用父類A中的這個方法,還可以調用自己本類中的方法)

例如:

class A:
@staticmethod
def func():
print(666)
A.func()

20180727 (面向對象的屬性 類方法和靜態方法)