Python __setattr__、 __getattr__、 __delattr__、__call__用法示例

作者:junjie 时间:2022-06-11 20:19:22 

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()

标签:Python,setattr,getattr,delattr,call
0
投稿

猜你喜欢

  • ASP制作中使用MYSQL的分析

    2008-10-13 09:25:00
  • Python 处理表格进行成绩排序的操作代码

    2022-08-25 02:49:36
  • tensorflow 1.0用CNN进行图像分类

    2022-08-17 17:32:29
  • Python学习笔记之列表推导式实例分析

    2021-04-30 15:00:38
  • django 环境变量配置过程详解

    2021-11-19 03:07:52
  • 在vue中使用export default导出的class类方式

    2024-04-09 10:48:47
  • django使用图片延时加载引起后台404错误

    2023-11-13 14:51:08
  • 基于mysq字段选择的详解

    2024-01-23 20:11:20
  • 利用XMLHTTP检测网址及探测服务器类型

    2009-04-24 15:12:00
  • vue打包之后生成一个配置文件修改接口的方法

    2024-05-29 22:45:27
  • Python基于Django实现验证码登录功能

    2023-06-25 03:21:13
  • vue项目部署到Apache服务器中遇到的问题解决

    2024-05-22 10:42:36
  • python可以美化表格数据输出结果的两个工具

    2022-06-05 02:33:32
  • 用Python爬取英雄联盟的皮肤详细示例

    2023-05-07 22:41:19
  • Python语言实现获取主机名根据端口杀死进程

    2023-07-01 10:05:58
  • 一个基于flask的web应用诞生 用户注册功能开发(5)

    2021-10-19 00:48:12
  • Selenium之模拟登录铁路12306的示例代码

    2022-01-22 17:06:27
  • Python实现aes加密解密多种方法解析

    2021-05-13 01:36:53
  • 从零开始实现Vue简单的Toast插件

    2024-05-13 09:13:55
  • 详解python连接telnet和ssh的两种方式

    2023-02-10 01:27:14
  • asp之家 网络编程 m.aspxhome.com