一、@classmethod
類方法,不需要執行個體化,也不需要self參數,需要一個cls參數,可以用類名調用,也可以用對象來調用。
原則上,類方法是将類本身作為對象進行操作的方法。假設有個方法,且這個方法在邏輯上采用類本身作為對象來調用更合理,那麼這個方法就可以定義為類方法
二、@staticmethod
靜态方法,不需要執行個體化,不需要self和cls等參數,就跟使用普通的函數一樣,隻是封裝在類中
靜态方法是類中的函數,不需要執行個體。靜态方法主要是用來存放邏輯性的代碼,邏輯上屬于類,但是和類本身沒有關系,也就是說在靜态方法中,不會涉及到類中的屬性和方法的操作。可以了解為,靜态方法是個獨立的、單純的函數,它僅僅托管于某個類的名稱空間中,便于使用和維護。
類方法和靜态方法的使用:
class Foo(object):
@classmethod
def cls_fun(cls):
return "hello world"
@staticmethod
def static_fun():
return "hello python"
foo = Foo()
print(Foo.cls_fun())
# print(foo.cls_fun())
print(Foo.static_fun())
注意點:
使用@staticmethod或@classmethod,就可以不需要執行個體化,直接類名.方法名()來調用。
如果在@staticmethod中要調用到這個類的一些屬性方法,隻能直接類名.屬性名或類名.方法名
@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,執行個體化對象等,避免寫死。
三、@property
屬性方法,主要作用是将一個操作方法封裝成一個屬性,使用者用起來就和操作普通屬性完全一緻,非常簡單.定義時,在執行個體方法的基礎上添加@property裝飾器,并且隻有一個self參數,調用時,不需要括号
@property 是經典類中的一種裝飾器,新式類中具有三種:
[email protected]擷取屬性
2.@方法名.setter 修改屬性
3.@方法名.deleter 删除屬性
@property的使用:
class Goods(object):
def __init__(self):
# 原價
self.original_price = 100
# 折扣
self.discount = 0.8
@property
def price(self):
# 實際價格 = 原價*折扣
new_price = self.original_price*self.discount
return new_price
@price.setter
def price(self,value):
self.original_price = value
@price.deleter
def price(self):
del self.original_price
obj = Goods()
# print(obj.price)
obj.price = 200
print(obj.price)
del obj.price # 删除了類中的price屬性若再次調用就會報錯
總結:類方法,是直接對類操作時候定義的,執行個體化方法是操作執行個體化對象時候定義的,靜态方法與類無關,就是獨立的邏輯單元。@property是将方法轉為屬性,直接可使用其傳回值,提供了可讀可寫可删除的操作,如果像隻讀效果,就隻需要定義@property就可以,不定義代表禁止其他操作。