1. 程式人生 > >python 舊類中使用property特性的方法

python 舊類中使用property特性的方法

eat not int dem getattr delet 調用 ise tex

在python中,我們可以攔截對象的所有特性訪問。通過這種攔截的思路,我們可以在舊式類中實現property方法。

__getattribute__(self, name) #當特性name被訪問時自動調用(只能在新式類中使用)
__getattr__(self, name) #當特性name被訪問且對象沒有相應的特性時被自動調用
__setattr__(self, name, value) #當試圖給特性name賦值時會被自動調用
__delattr__(self, name) #當試圖刪除特性name時被自動調用

#*相比於使用property有點復雜,但是特殊方法用途很廣

下面是舉例:

class Demo5(object):
    def __init__(self):
        print("這是構造函數")
        self._value1 = None
        self._value2 = None

    def __setattr__(self, key, value):
        print("try to set the value of the  %s property" % (key,))
        if key == newValue:
            self._value1, self._value2 
= value else: print("the property key is not newValue, now create or set it through __dict__") self.__dict__[key] = value def __getattr__(self, item): print("try to get the value of %s " % (item,)) if item == newValue: return self._value1, self._value2
else: print("the %s item is not exist" % (item,)) #raise AttributeError def __delattr__(self, item): if item == newValue: print("delete the value of newValue") del self._value1 del self._value2 else: print("delete other values ,the value name is %s" % item) if __name__ == "__main__": testDemo = Demo5() print(testDemo.newValue) testDemo.newValue = "name","helloworld" print("print the value of property:", testDemo.newValue) print(testDemo.notExist) del testDemo.newValue

下面是結果:

這是構造函數
try to set the value of the  _value1 property
the property key is not newValue, now create or set it through __dict__
try to set the value of the  _value2 property
the property key is not newValue, now create or set it through __dict__
try to get the value of newValue 
(None, None)
try to set the value of the  newValue property
try to set the value of the  _value1 property
the property key is not newValue, now create or set it through __dict__
try to set the value of the  _value2 property
the property key is not newValue, now create or set it through __dict__
try to get the value of newValue 
(print the value of property:, (name, helloworld))
try to get the value of notExist 
the notExist item is not exist
None
delete the value of newValue
delete other values ,the value name is _value1
delete other values ,the value name is _value2

**其實,我們可以發現在使用__setatter__ , __getatter__,__delatter__這些接口時會對其他的值造成影響,因為這個是通用的必須調用的接口。

python 舊類中使用property特性的方法