裝飾器property的簡單運用

property函數:在類中使用,將類中的方法假裝成一個屬性

使用方法:在函數,方法,類的上面一行直接@裝飾器的名字app

裝飾器的分類:函數

  裝飾器函數spa

  裝飾器方法:propertycode

  裝飾類對象

class Student:
    def __init__(self,name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter       #設置,修改(自我理解)
    def name(self,new_name):  
        if type(new_name) is str:  #只有當修改的值爲str類型,才能被修改
            self.__name = new_name
a1 = Student("諸葛")
print(a1.name)      #諸葛
a1.name = "睿智"
print(a1.name)      #睿智
a1.name = 123
print(a1.name)      #睿智

setter的用法:

  setter是隻有被property方法以後的,又實現了一個同名的方法,且被setter裝飾器裝飾了blog

   它的做用是用來保護一個變量,在修改的時候可以添加一些保護條件。資源

deleter的用法:

  一個方法被假裝成屬性後,應該能夠執行一個屬性的增刪改查操做,it

  因此deleter就是對應着被deleter裝飾的方法,這個方法並非只爲了刪除這個屬性,而是你在代碼中執行什麼就有什麼效果。class

class Goods:
    __discount = 0.8
    def __init__(self,price):
        self.__price = price
    @property
    def price(self):
        return self.__price * self.__discount
    @price.setter
    def price(self,new):
        if type(new) is int:
            self.__price =  new
    @price.deleter
    def price(self):
        del self.__price
apple = Goods(10)
print(apple.price)      #8.0
print(apple.__dict__)   #{'_Goods__price': 10}
apple.price = 20        #將__price的值進行修改
print(apple.price)      #16
print(apple.__dict__)   #{'_Goods__price': 20}
del apple.price         #刪除
print(apple.__dict__)    #{}

deleter一般用在

class A:
    def __init__(self):
        self.__f = open('aaa','w')

    @property
    def f(self):
        return self.__f

    @f.deleter
    def f(self):
        self.__f.close()    #先關閉文件
        del self.__f          #刪除文件

@classmethod 將類中的方法變成類方法,爲了避免建立類對象,而直接用類方法修改靜態私有屬性。用法以下

  只使用類中的資源,且這個資源能夠直接用類名引用的使用,那這個方法在方法上面@classmethod將這個方法變成類方法變量

class Goods:
    __discount = 0.8    #靜態私有屬性
    def __init__(self,price):
        self.__price = price  #私有對象屬性
        self.name = "apple"     #對象屬性
    @property
    def price(self):
        return self.__price *Goods.__discount

    @classmethod        #類方法
    def change_disount(cls,new):     #cls 表示Goods這個類
        cls.__discount = new    #對Goods中的靜態私有屬性進行修改
print(Goods.__dict__)       # '_Goods__discount': 0.8,
Goods.change_disount(0.7)
print(Goods.__dict__)       #'_Goods__discount': 0.7,                     

@staticmethod 靜態方法  (若是函數要在類中使用,就用靜態方法)

class Student:

    @staticmethod    #在類中建立函數
    def login(usr,pwd):
        print('IN LOGIN',usr,pwd)


Student.login('user','pwd')    

 

總結

#  類:
    # 靜態屬性         類  全部的對象都統一擁有的屬性
    # 類方法           類  若是這個方法涉及到操做靜態屬性、類方法、靜態方法                            cls 表示類
    # 靜態方法         類  普通方法,不使用類中的命名空間也不使用對象的命名空間   : 一個普通的函數    沒有默認參數
    # 方法             對象                                                                            self 表示對象
    # property方法     對象                                                                            slef 表示對象

isinstance(a,A)  判斷對象與類直接的關係

issubclass(A,B)     判斷類與類之間的關係

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   #isinstance判斷對象a與類A的關係(自我理解)
# print(isinstance(b,A))  #True
# print(isinstance(a,B))  #False
print(issubclass(B,A))  #True
print(issubclass(A,B))  #False  判斷類與類之間的關係
相關文章
相關標籤/搜索