標籤:執行 表示 lse 類之間的關係 繼承 使用 特點 font col
一、完整的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) is str: #因為名字是字串類型的,我們這樣設定可以保證只能用字串修改名字 self.__name = new @name.deleter def name(self): del self.__namexiaoming = Student(‘小明‘)print(xiaoming.name) #小明xiaoming.name = 123 # 不是字串修改不了print(xiaoming.name) # 小明xiaoming.name = ‘小花貓‘print(xiaoming.name) # 小花貓del xiaoming.nameprint(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.__pricebanana = Fruits(10)print(banana.price) # 折扣價7.0banana.price = 9print(banana.price) # 折扣價6.3del banana.priceprint(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 = newFruits.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: passclass B(A): passa = A()b = B()print(type(a) is A) # Trueprint(type(b) is B) # Trueprint(type(b) is A) # Falseprint(isinstance(a,A)) # Trueprint(isinstance(b,B)) # True# 子類是父類的類型,但是父類不是子類的類型print(isinstance(b,A)) # Trueprint(isinstance(a,B)) # False
2、issubclass:檢測類與類之間的關係
用法:issubclass(子類,父類)
class A: passclass B(A): passprint(issubclass(A,B)) # Falseprint(issubclass(B,A)) # True
python之property、類方法和靜態方法