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

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
複製代碼
相關文章
相關標籤/搜索