Python面向對象編程(2)——深入類的屬性

2 深入類的屬性
2.1 同名的類屬性與實例屬性
     在使用實例名.屬性名應用時,優先引用實例屬性
     使用類名.屬性名時,只能引用類屬性
classClassAttrDemo1:
    a=10
   def__init__(self):
       self.a=20
       self.b=20
   
cad1=ClassAttrDemo1()
print("example attribute:",cad1.a)
print("class attribute:",ClassAttrDemo1.a)
print("error:",ClassAttrDemo1.b)

2.2 屬性訪問的特殊方法(反射)
     字符串操作類的屬性/方法
     主要工具函數:has_attr(obj_name,'屬性')、set_attr(obj_name,'屬性','值')、get_attr(obj_name,'屬性','值')
classClassAttrDemo1:
    a=10
   def__init__(self):
       self.a=20
       self.b=20
   
cad1=ClassAttrDemo1()
# print("example attribute:",cad1.a)
# print("class attribute:",ClassAttrDemo1.a)
#print("error:",ClassAttrDemo1.b)
print("example attribute value:",getattr(cad1,'a'))
setattr(cad1,'a',80)
print("changed attribute value:",getattr(cad1,'a'))
print("attributexit:",hasattr(cad1,'c'));

2.3 屬性包裝
     將方法包裝爲屬性,隱藏相關實現(控制屬性類型或範圍、虛擬屬性)
     三種屬性操作:@property(可讀)、@<property-name>.setter(可寫)、@<property-name>.delete(可刪除)
# -*- coding:utf-8 -*-
classWasher:
   def__init__(self,water=10,scour=2):
       self._water=water#_water爲私有屬性
       self.scour=scour
       self.year=2012
   #方法包裝爲屬性  
   @property
   defwater(self):
       returnself._water
   
   #可寫
   @water.setter
   defwater(self,water):
       if0<water<200:
           self._water=water
       else:
           print("set water failure...")
   
   #虛擬屬性       
   @property
   deftotal_year(self):
       return2017-self.year
   
   defset_water(self,water):
       self.water=water
   
   defset_scour(self,scour):
       self.scour=scour
   
   defadd_water(self):
       print("add water:",self.water)
       
   defadd_scour(self):
       print("add scour:",self.scour)
   
   defstart_wash(self):
       self.add_water()
       self.add_scour()
       print("start wash ...")
       
if__name__ =='__main__':
    w=Washer(20,5)
   print(w.water)
    w.water=25
   print(w.water)
    w.water=222
   print(w.water)
   print(w.total_year)
2.4 描述符
實現特殊協議方法的類作爲另一個類的類屬性
攔截和控制屬性訪問,並且可以重複使用
特殊協議方法如下:__set__()、__get__()、__delete__()
class NonNegative:
    def __init__(self,default=0):
        self.default=default
    def __set__(self,instance,val):
        if val>=0:
            self.default=val
        else:
            print("The value must be positive")
    def __get__(self,instance,owner):
        return self.default
   
    def __delete__(self,instance):  
        pass
class Movie:
    rating=NonNegative()
    price=NonNegative()
    def __init__(self):
        pass
if __name__ == '__main__':
    m=Movie()
    print(m.rating)
    m.price=10
    print(m.price)
    m.price=-5
    print(m.price)

分類:數據描述符(實現所有特殊協議方法)、非數據描述符(實現部分特殊協議方法)
注:所有的類成員函數都是非數據描述符

同名的數據的實例屬性和非數據描述符(方法爲例)訪問的優先級,同名實例屬性會掩蓋或者隱藏方法

__call__()讓類的實例可以像函數一樣調用


發佈了34 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章