在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特性的方法的更多相关文章

  1. python定义类()中写object和不写的区别

    这里需要说明一下: python3中,类定义默认继承object,所以写不写没有区别 但在python2中,并不是这样 所以此内容是针对python2的,当然python3默认继承,不代表我们就傻乎乎 ...

  2. 【python】类中的self

    在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...

  3. Python: 类中为什么要定义__init__()方法

    学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...

  4. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  5. 类中为什么要定义__init__()方法

    总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1. ...

  6. C#判断一个类中有无"指定名称"的方法

    C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  7. QRadioButton类中Toggled()信号的使用方法

    QRadioButton类中Toggled()信号的使用方法 1.说明 QRadioButton中,Toggled()信号是在Radio Button状态(开.关)切换时发出的,而clicked()信 ...

  8. File类中的list和listFiles方法

    File类中的list和listFiles方法 list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组 listFiles()方法是返回某个目录下所有文件和目录的绝对路径, ...

  9. Python+selenium自动化测试中Windows窗口跳转方法

    Python+selenium自动化测试中Windows窗口跳转方法 #第一种方法 #获得当前窗口 nowhandle=driver.current_window_handle #打开弹窗 drive ...

随机推荐

  1. [Markdown]纯文本标记语言MarkdowPad2--MD语法知识

    ##1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 ####### h7 // 错误代码 ######## h8 // ...

  2. Asp.Net MVC part6 WebAPI

    两种web服务SOAP风格:基于方法,产品是WebServiceREST风格:基于资源,产品是WebAPI可以返回json.xml类型的数据对于数据的增.删.改.查,提供相对的资源操作,按照请求的类型 ...

  3. Asp.Net MVC part3 路由Route

    路由Route路由规则Route:可以查看源代码了解一下构造方法,需要指定路由格式.默认值.处理器三个值路由数据RouteData:当前请求上下文匹配路由规则而得到的一个对象,可以在Action中通过 ...

  4. Python的hashlib

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...

  5. 在WPF 4.5中跨线程更新集合

    WPF中一个非常强大的功能是数据绑定,我们可以把一个集合绑定到ListBox中,当集合的数据发生变更时,ListBox界面也会同步变更.本身这是一个非常美好的事情,但是美中不足的是:当把集合绑定到Li ...

  6. How to determine what causes a particular wait type

      By: Paul Randal Posted on: March 18, 2014 6:55 pm   [Edit 2016: Check out my new resource – a comp ...

  7. windbg学习—-.ecxr

      .ecxr 命令定位当前异常的上下文信息,并显示指定记录中的重要寄存器 0:000> .ecxr eax=10000000 ebx=7ffd9000 ecx=77386500 edx=002 ...

  8. 使用Jenkins部署Spring Boot

    原文:http://www.cnblogs.com/ityouknow/p/7899349.html jenkins是devops神器,本篇文章介绍如何安装和使用jenkins部署Spring Boo ...

  9. 【iOS微博客户端开发】1、微博整体项目的构建

    回顾自己做过的项目,总结里面的知识点,分享自己参照WXHL的视频开发的一个模拟微博客户端的过程,为了还在IOS上找不到项目参考的朋友,这里会由一系列手把手的教程,如有不足,还希望可以抖抖小手,献上您宝 ...

  10. golangWEB框架gin学习之获取post参数

    原文地址:http://www.niu12.com/article/41 package main import ( "fmt" "github.com/gin-goni ...