当前位置:
首页 > Python基础教程 >
-
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
这篇文章主要介绍了Python setattr、 getattr、 delattr、__call__用法示例,本文分别对vb.net教程C#教程python教程SQL教程access 2010教程这几个魔法方法做了讲解,需要的朋友可以参考下
getattr
getattr
函数属于内建函数,可以通过函数名称获取
复制代码代码如下:
value = obj.attribute
value = getattr(obj, "attribute")
使用getattr
来实现工厂模式
复制代码代码如下:
#一个模块支持html、text、xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出
import statsout
def output(data, format="text"):
output_function = getattr(statsout, "output_%s" %format)
return output_function(data)
__call__
__call__
方法用于实例自身的调用:
复制代码代码如下:
class storage(dict):
# __call__方法用于实例自身的调用
#达到()调用的效果
def __call__ (self, key):
try:
return self[key]
except KeyError, k:
return None
s = storage()
s['key'] = 'value'
print s(key) #调用__call__
__getattr__
从对象中读取某个属性时,首先需要从self.__dicts__中搜索该属性,再从__getattr__中查找。
复制代码代码如下:
class A(object):
def __init__(self):
self.name = 'from __dicts__: zdy'
def __getattr__(self, item):
if item == 'name':
return 'from __getattr__: zdy'
elif item == 'age':
return 26
a = A()
print a.name # 从__dict__里获得的
print a.age # 从__getattr__获得的
__setattr__
__setattr__
函数是用来设置对象的属性,通过object中的__setattr__函数来设置属性:
复制代码代码如下:
class A(object):
def __setattr__(self, *args, **kwargs):
print 'call func set attr'
return object.__setattr__(self, *args, **kwargs)
__delattr__
__delattr__
函数式用来删除对象的属性:
复制代码代码如下:
class A(object):
def __delattr__(self, *args, **kwargs):
print 'call func del attr'
return object.__delattr__(self, *args, **kwargs)
例子
完整例子可以参考微博API:http://github.liaoxuefeng.com/sinaweibopy/
复制代码代码如下:
class _Executable(object):
def __init__(self, client, method, path):
self._client = client
self._method = method
self._path = path
#__call__函数实现_Executable函数对象为可调用的
def __call__(self, **kw):
method = _METHOD_MAP[self._method]
if method==_HTTP_POST and 'pic' in kw:
method = _HTTP_UPLOAD
return _http_call('%s%s.json' % (self._client.api_url, self._path), method, self._client.access_token, **kw)
def __str__(self):
return '_Executable (%s %s)' % (self._method, self._path)
__repr__ = __str__
class _Callable(object):
def __init__(self, client, name):
self._client = client
self._name = name
def __getattr__(self, attr):
if attr=='get':
#初始化_Executable对象,调用__init__函数
return _Executable(self._client, 'GET', self._name)
if attr=='post':
return _Executable(self._client, 'POST', self._name)
name = '%s/%s' % (self._name, attr)
return _Callable(self._client, name)
def __str__(self):
return '_Callable (%s)' % self._name
__repr__ = __str__
而在源码中,存在下面代码片段:
复制代码代码如下:
class APIClient(object):
'''
API client using synchronized invocation.
'''
...
def __getattr__(self, attr):
if '__' in attr:
return getattr(self.get, attr)
return _Callable(self, attr)
因此,加入我们初始化对象,并调用某函数如下:
复制代码代码如下:
client = APIClient(...)
#会调用__getattr__函数,从而调用__call__函数
client.something.get()
来源:https://www.jb51.net/article/61826.htm
栏目列表
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
开启SQLSERVER数据库缓存依赖优化网站性能
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比