1. 程式人生 > >面向物件-類中的三個裝飾器

面向物件-類中的三個裝飾器

為了程式碼更加完善,引入幾個裝飾器..

裝飾類中的方法

  • @classmethod    --->裝飾類方法,不用self屬性,只用類的cls屬性

  • @staticmethod    --->裝飾靜態方法,既不用self屬性,又不用類cls的屬性

  • @property           --->把一個方法偽裝屬性

下面具體說說他們的用法:

[email protected]裝飾類方法,那什麼是類方法呢?

在類中一個方法不用物件屬性,但使用靜態屬性,那這個方法就是類方法,被classmethod裝飾器裝飾的方法,都有一個預設的引數cls,這個引數就是當前類!

class A:
    __count = 0
    def __init__(self,name):
        self.name = name
        self.__add_count()  #只要執行init方法例項化物件就會產生呼叫 __add_count(),從而對靜態屬性__count操作
    @classmethod
    def __add_count(cls):  #私有方法
        cls.__count += 1  #讓這個方法只能在內部被使用
    @classmethod #被classmethod裝飾器裝飾的方法,都有一個預設的引數,這個引數就是當前類
def show_count(cls): return cls.__count print(A.show_count()) # 0 類呼叫show_count方法檢視類的靜態屬性 Sheldon = A('Sheldon') # 例項化一個物件 print(Sheldon.show_count()) # 1 物件呼叫show_count方法檢視類的靜態屬性

可以看出呼叫類方法,可以用物件呼叫,也可以使用類呼叫
但是這個方法預設引數永遠是當前類的名稱空間,而不是物件的
 

[email protected]裝飾器裝飾靜態方法,什麼靜態方法呢?

      如果一個類中的方法不使用物件屬性也不使用靜態屬性 -- 靜態方法,@staticmethod裝飾的這個方法實際上這個方法就是一個普通函式.

  

總結:

          普通方法        類方法          靜態方法

預設引數       self          cls            無

操作的變數    操作物件屬性       操作靜態屬性        既不操作物件屬性,也不操作類的屬性

所屬名稱空間     類           類             類

呼叫方式      物件          類/物件          類/物件

裝飾器        無         @classmethod      @staticmethod  

 

               普通的方法           類方法             靜態方法 預設引數        self                cls                無 操作的變數      操作物件的屬性     操作靜態屬性         既不操作物件屬性,也不操作類的屬性 所屬的名稱空間   類                  類                 類 呼叫方式        物件                類/物件             類/物件 對應的裝飾器     無                @classmethod        @staticmethod

 

[email protected] 把一個方法偽裝成屬性

@name.setter   注意,setter 裝飾的函式名叫什麼,那麼在這個函式中絕對不可以對這個函式名同名屬性的修改

@name.deleter  呼叫方方法進行刪除屬性

例1
from math import pi
class Circle:
    def __init__(self,r):
        self.r = r

    @property  # 把一個方法偽裝成屬性 
    def area(self):   # 被property裝飾器裝飾的方法不能傳遞除self以外的引數
        return pi*self.r**2

    @property
    def perimeter(self):
        return self.r*pi*2

c1 = Circle(5)
print(c1.area)
c1.r = 10
print(c1.area)   呼叫的時候不用加()

示例2

class Person:
    def __init__(self,name):
        self.__name = name  # 不讓外部隨便修改
    @property
    def name(self):
        return self.__name

Sheldon = Person('Sheldon')
print(Sheldon.name) #這樣寫起到不容易被別人修改的作用

 

 

 

...