1、完整的property
一、定義
一個方法被假裝成屬性以後,應該能夠執行一個屬性的增刪改查操做,
增長和修改就對應着被setter裝飾的方法,
刪除一個屬性對應着被deleter裝飾的方法。post
@property:把方法假裝成屬性,只能有一個參數selfui
@被property裝飾的方法名.setter:
當被property裝飾的方法,又實現了一個同名方法,且被setter裝飾器裝飾了,
那麼在對被裝飾的方法賦值的時候,就會觸發被setter裝飾器裝飾的方法,
這個方法必需要傳一個參數接收等號後面的值,
是用來保護一個變量在修改的時候可以添加一些保護條件。this
@被property裝飾的方法名.deleter:
當被property裝飾的方法,又實現了一個同名方法,且被deleter裝飾器裝飾了,
那麼在對被裝飾的方法進行刪除的操做時,就會觸發被deleter裝飾器裝飾的方法,
這個方法並不能在執行的時候真的刪除這個屬性,而是你在代碼中執行什麼就有什麼效果.spa
二、例題code
學生類 class Student: def __init__(self,name): self.__name = name @property def name(self): return self.__name @name.setter def name(self,new): if type(new) is str: #由於名字是字符串類型的,咱們這樣設置能夠保證只能用字符串修更名字 self.__name = new @name.deleter def name(self): del self.__name xiaoming = Student('小明') print(xiaoming.name) #小明 xiaoming.name = 123 # 不是字符串修改不了 print(xiaoming.name) # 小明 xiaoming.name = '小花貓' print(xiaoming.name) # 小花貓 del xiaoming.name print(xiaoming.__dict__) # {} 空字典 水果類: class Fruits: __discount = 0.7 def __init__(self,price): self.__price = price @property def price(self): return self.__price * Fruits.__discount @price.setter def price(self,new): if type(new) is int or float: self.__price = new @price.deleter def price(self): del self.__price banana = Fruits(10) print(banana.price) # 折扣價7.0 banana.price = 9 print(banana.price) # 折扣價6.3 del banana.price print(banana.__dict__) # {} 空字典
三、總結:
被setter和deleter裝飾的方法名必須和被property裝飾的方法名一致,對象.方法名 不加括號 能夠調用被property裝飾的方法,
當對被property裝飾的方法賦值時,就會觸發被setter裝飾的方法,當對被property裝飾的方法進行刪除del操做時,就會觸發
被deleter裝飾的方法。
注意:(通常來講用的最多的是property,其餘兩個看狀況而使用)對象
2、類方法:
用@classmethod裝飾
經過類名調用,
類方法默認形參用cls表示,而不用self,
即便用對象去調用類方法,cls默認傳進去的仍是類的命名空間地址,
能夠直接經過類去修改類的屬性,不須要實例化。blog
class Fruits: __discount = 0.7 # 類的靜態屬性 def __init__(self,price): self.__price = price # 對象的私有屬性 @property def price(self): return self.__price * Fruits.__discount @classmethod def change_discount(cls,new): # 類方法默認形參用cls表示,而不用self cls.__discount = new Fruits.change_discount(0.6) print(Fruits.__dict__) # '_Fruits__discount': 0.6
類方法的特色:
只使用類中的資源,且這個資源能夠直接用類名引用,那這個方法應該被改成一個類方法繼承
3、靜態方法
被@staticmethod裝飾的方法,不使用類中的命名空間也不使用對象的命名空間,
能夠傳參,也能夠不傳參,沒有默認參數(self,cls),至關於一個類外的普通的方法,
不一樣的是調用的時候須要 類名.方法名資源
class Student: @staticmethod def login(): print('登陸成功') Student.login()
4、類中的方法屬性總結
類: 成員: 標準使用者: 默認形參:
靜態屬性 類/對象
類方法 類 cls 表示類
靜態方法 類
方法 對象 self 表示對象
property方法 對象 self 表示對象字符串
注意:有些成員用類和對象都是能夠調用的,不過建議按照標準使用者去調用。
5、
一、isinstance:判斷一個對象是不是一個已知的類型
print(type(123) is int) # True
print(isinstance(123,int)) # True
# isinstance還能夠檢測對象與類之間的關係(包括繼承)
# type不能檢測繼承關係
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 print(isinstance(b,B)) # True # 子類是父類的類型,可是父類不是子類的類型 print(isinstance(b,A)) # True print(isinstance(a,B)) # False
二、issubclass:檢測類與類之間的關係
用法:issubclass(子類,父類)
class A: pass class B(A): pass print(issubclass(A,B)) # False print(issubclass(B,A)) # True