裝飾類中的方法函數
在類中一個方法不用對象屬性,但使用靜態屬性,那這個方法就是類方法,被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方法查看類的靜態屬性 能夠看出調用類方法,能夠用對象調用,也能夠使用類調用 可是這個方法默認參數永遠是當前類的命名空間,而不是對象的
若是一個類中的方法不使用對象屬性也不使用靜態屬性 -- 靜態方法,@staticmethod裝飾的這個方法實際上這個方法就是一個普通函數.對象
普通方法 | 類方法 | 靜態方法 | |
---|---|---|---|
默認參數 | self | cls | 無 |
操做的變量 | 操做對象屬性 | 操做類屬性 | 既不操做對象屬性,也不操做類屬性 |
所屬的命名空間 | 類 | 類 | 類 |
調用方法 | 對象 | 類/對象 | 類/對象 |
裝飾器 | @classmethod | @staticmethod |
@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)