python3--__getattr__和__setattr__捕捉属性的一个引用
__getattr__和__setattr__捕捉属性的一个引用
__getattr__方法是拦截属性点号运算。更确切地说,当通过对未定义(不存在)属性名称和实例进行点号运算时,就会用属性名称为字符串调用这个方祛。如果Python可通过其继承树搜索流程找到这个属性,该方法就不会被调用.因为有这种情况,__getattr__可以作为钩子来通过通用的方式响应属性请求。例子如下。
#!/usr/bin/env python
# -*- coding:utf-8 -*- class empty:
def __getattr__(self, attrname):
if attrname == "age":
return 40
else:
raise ArithmeticError x = empty()
print(x.age)
运行结果:
40
如果想使用这个方法,要确定是对属性字典做索引运算,来赋值任何实例的。使用self.__dict__['name'] = x,而不是self,name = x。
#!/usr/bin/env python
# -*- coding:utf-8 -*- class accesscontrol:
def __setattr__(self, key, value):
if key == 'age':
self.__dict__[key] = value
else:
raise AttributeError x = accesscontrol()
x.age = 40
print(x.age)
运行结果:
40
模拟实例属性的私有性
下列程序代码把上一个例子通用化了.让每个子类都有自己的私有变量名,这些变量名无法通过其实例进行赋值。
#!/usr/bin/env python
# -*- coding:utf-8 -*- class PrivateExc(Exception):pass class Privacy:
def __setattr__(self, attrname, value):
if attrname in self.privates:
raise PrivateExc(attrname,self)
else:
self.__dict__[attrname] = value class Test1(Privacy):
privates = ['age'] class Test2(Privacy):
privates = ['name', 'pay']
def __init__(self):
self.__dict__['name'] = 'Tom' x = Test1()
y = Test2() x.name = 'Bob'
print(x.name)
# y.name = 'Sue' # <== fails # x.age = 40 # <== fails
y.age = 30
print(y.age)
运行结果:
Bob
30
python3--__getattr__和__setattr__捕捉属性的一个引用的更多相关文章
- [Python3 填坑] 016 对 __getattr__ 和 __setattr__ 举例
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __getattr__ 2.2 __setattr__ 1. print( 坑的信息 ) 挖坑时间:2019/04/07 明细 坑的编码 ...
- 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__
反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...
- __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)
自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = n ...
- python __getattribute__、__getattr__、__setattr__详解
__getattribute__ 官方文档中描述如下: 该方法可以拦截对对象属性的所有访问企图,当属性被访问时,自动调用该方法(只适用于新式类).因此常用于实现一些访问某属性时执行一段代码的特性. 需 ...
- 类的专有方法(__getattr__和__setattr__、__delattr__)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.360doc.com/content/15/0413/19/12067640_4629 ...
- opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
- linq to sql用partial扩展属性,创建一个部分类(用于多表连接)
1.在窗体中创建dataGridView显示表: using System; using System.Collections.Generic; using System.ComponentModel ...
- Confluence 6 属性的一个活动
为了启用属性,使用上面描述的方法.针对所有的用户,属性每一个访问的页面,将会在你的应用服务器中进行记录,直到你对 Confluence 进行重启.请注意每次用户访问一个链接,一个单一的属性将会被打印出 ...
- python3 在 windows 读取路径多了一个\u202a 是咋回
python3 在 windows 读取路径多了一个\u202a 是咋回事
随机推荐
- Java环境安装与Eclipse安装
1.jdk下载安装 2.Eclipse下载安装 遇到的问题: 出现问题原因可能有两个:1)没有配置环境变量 2)jdk和eclipse安装的版本不一致,都是64位或者都是32位. 本人出现错误的原因: ...
- 理解C#系列 / 前言
前言 索引 写什么? 为什么写? 怎么写? 写什么? 写和C#编程相关的知识. 写知识的定义,附加对知识的理解. 写知识的作用,使用的场景,使用的条件. 写知识的本质,技术的结构,工作的原理. 写知识 ...
- 自动完成文本框(AutoCompleteTextView与MultiAutoCompleteTextView)关联适配器
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...
- git 设置了ssh key 还是需要输入账户和密码
参考这篇文章https://blog.csdn.net/shahuhu000/article/details/86625987 git remote remove origingit remote a ...
- IOS自动化测试之UIAutomation
通过Xcode工具编写运行测试脚本 1.当你有了一个应用的源代码之后,在Xcode工具中,首先选中被测应用,然后点击菜单栏中的“Product-Profile”,则会弹出Instruments工具,在 ...
- 分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
这张图每位程序员应该都深有感触. 人民心目中的程序员是这样的:坐在电脑面前噼里啪啦敲着键盘,运键如飞. 现实中程序员是这样的:编码5分钟,调试两小时. 今天我要给大家分享一个用WebGL开发的网站,感 ...
- mac ssd开启trim模式
开启方法 sudo trimforce enable
- Entity Framework插入数据报错:Validation failed for one or more entities
www.111cn.net 编辑:lanve 来源:转载 今天在处理Entity Framework插入数据库时,报错: Validation failed for one or more entit ...
- C#中窗体边框隐藏
设置窗体属性 FormBorderStyle 为 None
- java 正则表达式如何提取中文的问题
String regex="([\u4e00-\u9fa5]+)"; String str="132更新至456"; Matcher matcher = Pat ...