@classmethod、@staticmethod、@property

python三大裝飾器

  • @staticmethod(靜態方法)、@classmethod(類方法)、@property(描述符)

@classmethod、@staticmethod

class Dog:                                                                                                        
    dogbook = {'黃色':30, '黑色':20, '白色':10}   #類變量                                                                  
                                                                                                                  
    def __init__(self, name, color, weight):    #類屬性                                                              
        self.name = name                                                                                          
        self.color = color                                                                                        
        self.weight = weight                                                                                      
                                                                                                                  
    #實例方法:定義時,必須把self作爲第一個參數,可以訪問實例變量,只能通過實例名訪問                                                                   
    def bark(self):                                                                                               
        print(f'{self.name} 叫了起來')                                                                                
                                                                                                                  
    #類方法:定義時,必須把類作爲第一個參數,可以訪問類變量,可以通過實例名或類名訪問                                                                     
    @classmethod                                                                                                  
    def dog_num(cls):                                                                                             
        num = 0                                                                                                   
        for v in cls.dogbook.values():                                                                            
            num = num + v                                                                                         
        return num                                                                                                
                                                                                                                  
    #靜態方法:不強制傳入self或者cls,它對類和實例一無所知。不能訪問類變量,也不能訪問實例變量,可以通過實例名或類名訪問                                                
    @staticmethod                                                                                                 
    def total_weights(dogs):                                                                                      
        total = 0                                                                                                 
        for o in dogs:                                                                                            
            total = total + o.weight                                                                              
        return total                                                                                              
                                                                                                                  
print(f'共有{Dog.dog_num()} 條狗')                                                                                    
d1 = Dog('大黃', '黃色', 10)                                                                                          
d1.bark()                                                                                                         
print(f'共有{d1.dog_num()} 條狗')      #classmethod  可以訪問全局變量                                                                                 
                                                                                                                  
d2 = Dog('旺財', '黑色', 8)                                                                                           
d2.bark()                                                                                                         
                                                                                                                  
print(f'狗共重{Dog.total_weights([d1,d2])} 公斤')       #staticmethod和對於類和實例一無所知,依然把他放在類裏面,完全是因爲它的邏輯和                         類有關聯,讓代碼看起來更加的整潔                                                                
                                                                                                                  

@property應用

一、@property的應用,其功能1是可定義只讀屬性
舉例:

class Person(object):                            
    def __init__(self, name, age=18):            
        self.name = name                         
        self._age = age                          
                                                 
    @property                                    
    def age(self):                               
        return self._age                         
                                                 
xm = Person('xiaoming')                          
print(xm.age)
#輸出結果是 18

xm.age = 8    
print(xm.age) 
#結果報錯,說明不能夠賦值,因爲它是隻讀屬性                                    
  • 在python中定義只讀屬性非@property莫屬,如果細心留意大部分源碼,都跑不了@property的身影。而定義只讀屬性也很簡單:以需要定義的屬性爲方法名(上例age屬性定義爲方法),其上裝飾內置裝飾器@property就ok了。

二、@property真正強大的是可以限制屬性的定義。
舉例:

class Person(object):                                      
    def __init__(self, name, age):                         
        self.name = name                                   
        self.__age = 18                                    
                                                           
    @property                                              
    def age(self):                                         
        return self.__age                                  
                                                           
    @age.setter                                            
    def age(self, age):                                    
        if age < 18:                                       
            print('年齡必須大於18歲')                             
            return                                         
        self.__age = age                                   
        return self.__age                                  
                                                           
xm = Person('xiaoming', 20)                                
print(xm.age)                                              
xm.age = 20                                                
print(xm.age)                                              
xm.age = 15                                                
print(xm.age)                                              
  • 這就是@property定義可訪問屬性的語法,即仍舊以屬性名爲方法名,並在方法名上增加@屬性.setter就行了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章