類中三個裝飾器

類中的三個裝飾器

裝飾類中的方法函數

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

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

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

1、@classmethod

在類中一個方法不用對象屬性,但使用靜態屬性,那這個方法就是類方法,被classmethod裝飾器裝飾的方法,都有一個默認的參數cls,這個參數就是當前類!code

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方法查看類的靜態屬性


能夠看出調用類方法,能夠用對象調用,也能夠使用類調用
可是這個方法默認參數永遠是當前類的命名空間,而不是對象的

2、@staticmethod裝飾器裝飾靜態方法

若是一個類中的方法不使用對象屬性也不使用靜態屬性 -- 靜態方法,@staticmethod裝飾的這個方法實際上這個方法就是一個普通函數.對象

普通方法 類方法 靜態方法
默認參數 self cls
操做的變量 操做對象屬性 操做類屬性 既不操做對象屬性,也不操做類屬性
所屬的命名空間
調用方法 對象 類/對象 類/對象
裝飾器 @classmethod @staticmethod

三.@property 把一個方法假裝成屬性

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

@name.deleter 調用方方法進行刪除屬性io

示例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)   調用的時候不用加()
class Person:
    def __init__(self,name):
        self.__name = name  # 不讓外部隨便修改
    @property
    def name(self):
        return self.__name

Sheldon = Person('Sheldon')
print(Sheldon.name) #這樣寫起到不容易被別人修改的做用
property之setter和deleter

class Person:
    def __init__(self,name,height,weight):
        self.__name=name
        self.__height=height
        self.__weight=weight
    @property
    def name(self):
        return '[個人名字是:%s]'%self.__name
    #用property裝飾的方法名.setter
    @name.setter
    def name(self,new_name):
        # if not isinstance(new_name,str):
        if type(new_name) is not str:
            raise Exception('改不了')
        if new_name.startswith('sb'):
            raise Exception('不能以sb開頭')
        self.__name=new_name

    # 用property裝飾的方法名.deleter
    @name.deleter
    def name(self):
        # raise Exception('不能刪')
        print('刪除成功')
        # del self.__name

p=Person('lqz',1.82,70)
# print(p.name)
# p.name='pppp'
# p.name='xxx'
#改不了,直接拋一異常
# p.name=999
# p.name='sb_nick'

# print(p.name)

del p.name
print(p.name)
相關文章
相關標籤/搜索