zoukankan      html  css  js  c++  java
  • 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__这些接口时会对其他的值造成影响,因为这个是通用的必须调用的接口。

  • 相关阅读:
    Quartz使用总结
    quartz基本介绍和使用
    Spring的StringUtils工具类
    JreBel热部署不生效,2019最新解决方法
    解决IDEA下SpringBoot启动没有Run Dashboard并找回
    IDEA十大经典常用插件
    Java8 Comparator 排序方法
    JRebel 激活码 2020
    比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法
    kafka的Lag 计算误区及正确方式
  • 原文地址:https://www.cnblogs.com/zhangdewang/p/9072599.html
Copyright © 2011-2022 走看看