python之property、類方法和靜態方法

來源:互聯網
上載者:User

標籤:執行   表示   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、類方法和靜態方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.