天天看點

python中的@classmethod,@staticmethod,@property三種裝飾器類方法和靜态方法的使用:

一、@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就可以,不定義代表禁止其他操作。