使用方法:在函數,方法,類的上面一行直接@裝飾器的名字app
裝飾器的分類:函數
裝飾器函數spa
裝飾器方法:propertycode
裝飾類對象
class Student: def __init__(self,name): self.__name = name @property def name(self): return self.__name @name.setter #設置,修改(自我理解) def name(self,new_name): if type(new_name) is str: #只有當修改的值爲str類型,才能被修改 self.__name = new_name a1 = Student("諸葛") print(a1.name) #諸葛 a1.name = "睿智" print(a1.name) #睿智 a1.name = 123 print(a1.name) #睿智
setter是隻有被property方法以後的,又實現了一個同名的方法,且被setter裝飾器裝飾了blog
它的做用是用來保護一個變量,在修改的時候可以添加一些保護條件。資源
一個方法被假裝成屬性後,應該能夠執行一個屬性的增刪改查操做,it
因此deleter就是對應着被deleter裝飾的方法,這個方法並非只爲了刪除這個屬性,而是你在代碼中執行什麼就有什麼效果。class
class Goods: __discount = 0.8 def __init__(self,price): self.__price = price @property def price(self): return self.__price * self.__discount @price.setter def price(self,new): if type(new) is int: self.__price = new @price.deleter def price(self): del self.__price apple = Goods(10) print(apple.price) #8.0 print(apple.__dict__) #{'_Goods__price': 10} apple.price = 20 #將__price的值進行修改 print(apple.price) #16 print(apple.__dict__) #{'_Goods__price': 20} del apple.price #刪除 print(apple.__dict__) #{}
class A: def __init__(self): self.__f = open('aaa','w') @property def f(self): return self.__f @f.deleter def f(self): self.__f.close() #先關閉文件 del self.__f #刪除文件
只使用類中的資源,且這個資源能夠直接用類名引用的使用,那這個方法在方法上面@classmethod將這個方法變成類方法變量
class Goods: __discount = 0.8 #靜態私有屬性 def __init__(self,price): self.__price = price #私有對象屬性 self.name = "apple" #對象屬性 @property def price(self): return self.__price *Goods.__discount @classmethod #類方法 def change_disount(cls,new): #cls 表示Goods這個類 cls.__discount = new #對Goods中的靜態私有屬性進行修改 print(Goods.__dict__) # '_Goods__discount': 0.8, Goods.change_disount(0.7) print(Goods.__dict__) #'_Goods__discount': 0.7,
class Student: @staticmethod #在類中建立函數 def login(usr,pwd): print('IN LOGIN',usr,pwd) Student.login('user','pwd')
# 類: # 靜態屬性 類 全部的對象都統一擁有的屬性 # 類方法 類 若是這個方法涉及到操做靜態屬性、類方法、靜態方法 cls 表示類 # 靜態方法 類 普通方法,不使用類中的命名空間也不使用對象的命名空間 : 一個普通的函數 沒有默認參數 # 方法 對象 self 表示對象 # property方法 對象 slef 表示對象
class A:pass class B(A):pass a = A() b = B() # print(type(a) is A) #True # print(type(b) is B) #True # print(type(b) is A) #False # print(isinstance(a,A)) #True #isinstance判斷對象a與類A的關係(自我理解) # print(isinstance(b,A)) #True # print(isinstance(a,B)) #False print(issubclass(B,A)) #True print(issubclass(A,B)) #False 判斷類與類之間的關係