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定义类()中写object和不写的区别
这里需要说明一下: python3中,类定义默认继承object,所以写不写没有区别 但在python2中,并不是这样 所以此内容是针对python2的,当然python3默认继承,不代表我们就傻乎乎 ...
- 【python】类中的self
在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...
- Python: 类中为什么要定义__init__()方法
学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...
- 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法
实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...
- 类中为什么要定义__init__()方法
总结一下, 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合 学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1. ...
- 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 ...
- QRadioButton类中Toggled()信号的使用方法
QRadioButton类中Toggled()信号的使用方法 1.说明 QRadioButton中,Toggled()信号是在Radio Button状态(开.关)切换时发出的,而clicked()信 ...
- File类中的list和listFiles方法
File类中的list和listFiles方法 list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组 listFiles()方法是返回某个目录下所有文件和目录的绝对路径, ...
- Python+selenium自动化测试中Windows窗口跳转方法
Python+selenium自动化测试中Windows窗口跳转方法 #第一种方法 #获得当前窗口 nowhandle=driver.current_window_handle #打开弹窗 drive ...
随机推荐
- jeeplus中两个项目redis冲突问题
修改端口号[两个项目使用不同的database]
- iptables配置
iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTAB ...
- window安装mysql5.7.11
1.到mysql官网(http://dev.mysql.com/downloads/mysql/)下载压缩包,我的是win7 64位的,根据自己的系统进行下载 2.解压到自己的目录,我的是 E:\so ...
- WCF报错
1."没有终结点在侦听可以接受消息的 http://localhost:8084/Service1.svc.这通常是由于不正确的地址或者 SOAP 操作导致的.如果存在此情况,请参见 Inn ...
- socket编程演示样例(多线程)
client代码例如以下: import java.io.*; import java.net.*; import java.util.Scanner; public class SimpleChat ...
- Node.js meitulu图片批量下载爬虫 1.05版(Final最终版)
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- System.getProperty("line.separator")
转自:http://blog.sina.com.cn/s/blog_707577700100nv74.html 标题所写的代码能获得当前系统的换行符. 不要随便用 \n\r \n \r,因 ...
- RabbitMQ搭建
1. RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议 2.安装与部署 RabbitMQ的安装依赖E ...
- MPTCP 源码分析(四) 发送和接收数据
简述: MPTCP在发送数据方面和TCP的区别是可以从多条路径中选择一条 路径来发送数据.MPTCP在接收数据方面与TCP的区别是子路径对无序包 进行重排后,MPTCP的mpcb需要多所有子 ...
- HDU 1560 IDA*搜索
用N个串中找到最短的公共串(不要求连续,仅仅要相对位置一样就可以) 迭代加深搜索就可以 剪枝:当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回. #include "stdio ...