python 旧类中使用property特性的方法

Posted 在左手

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 旧类中使用property特性的方法相关的知识,希望对你有一定的参考价值。

在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特性的方法的主要内容,如果未能解决你的问题,请参考以下文章

python类中的@property和@staticmethod分别有什么用,还有其他的吗?

列出python类中的@property修饰方法

python基础 ---- property特性 使用

python类中@property使用

面向对象三大特性——封装(含property)

Python类中的字段,方法,属性区别及StaticMethod, Property