python之property、類方法和靜態方法
一、完整的property
1、定義
一個方法被偽裝成屬性之後,應該可以執行一個屬性的增刪改查操作,
增加和修改就對應著被setter裝飾的方法,
刪除一個屬性對應著被deleter裝飾的方法。
@property:把方法偽裝成屬性
@被property裝飾的方法名.setter:
當被property裝飾的方法,又實現了一個同名方法,且被setter裝飾器裝飾了,
那麽在對被裝飾的方法賦值的時候,就會觸發被setter裝飾器裝飾的方法,
這個方法必須要傳一個參數接收等號後面的值,
是用來保護一個變量在修改的時候能夠添加一些保護條件。
@被property裝飾的方法名.deleter:
當被property裝飾的方法,又實現了一個同名方法,且被deleter裝飾器裝飾了,
那麽在對被裝飾的方法進行刪除的操作時,就會觸發被deleter裝飾器裝飾的方法,
這個方法並不能在執行的時候真的刪除這個屬性,而是你在代碼中執行什麽就有什麽效果.
2、例題
學生類 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) isstr: #因為名字是字符串類型的,我們這樣設置可以保證只能用字符串修改名字 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__) # {} 空字典
3、總結:
被setter和deleter裝飾的方法名必須和被property裝飾的方法名一致,對象.方法名 不加括號 可以調用被property裝飾的方法,
當對被property裝飾的方法賦值時,就會觸發被setter裝飾的方法,當對被property裝飾的方法進行刪除del操作時,就會觸發
被deleter裝飾的方法。
註意:(一般來說用的最多的是property,其他兩個看情況而使用)
二、類方法:
用@classmethod裝飾
通過類名調用
類方法默認形參用cls表示,而不用self
可以直接通過類去修改類的屬性,不需要實例化
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
類方法的特點:
只使用類中的資源,且這個資源可以直接用類名引用,那這個方法應該被改為一個類方法
三、靜態方法
被@staticmethod裝飾的方法,不使用類中的命名空間也不使用對象的命名空間,
可以傳參,也可以不傳參,沒有默認參數(self,cls),相當於一個類外的普通的方法,
不同的是調用的時候需要 類名.方法名
class Student: @staticmethod def login(): print(‘登錄成功‘) Student.login())
四、類中的方法屬性總結
類: 成員: 標準使用者: 默認形參:
靜態屬性 類/對象
類方法 類 cls 表示類
靜態方法 類
方法 對象 self 表示對象
property方法 對象 self 表示對象
註意:有些成員用類和對象都是可以調用的,不過建議按照標準使用者去調用。
五、
1、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
2、issubclass:檢測類與類之間的關系
用法:issubclass(子類,父類)
class A: pass class B(A): pass print(issubclass(A,B)) # False print(issubclass(B,A)) # True
python之property、類方法和靜態方法