20180727 (面向對象的屬性 類方法和靜態方法)
阿新 • • 發佈:2018-07-27
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 (面向對象的屬性 類方法和靜態方法)