python 中__getattr__ 以及 __setattr__

python 中__getattr__ 以及 __setattr__

下面是mydict.py:

#!/usr/bin/env python

class Dict(dict):

    def __init__(self, **kw):
        super(Dict, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"‘Dict‘ object has no attribute ‘%s‘" % key)

    def __setattr__(self, key, value):
        self[key] = value

d = Dict(a=1, b=2)
print d[‘a‘]
# use __getattr__ function
print d.a
print d.b
# use __setattr__ function
d.b = 3
print d.b
#print d.c

class Test():
    def __getattr__(self, a):
        return a

t = Test()
print t.ni

结果为:

1
1
2
3
ni

运行单元测试:

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    def setUp(self):
        print(‘setUp...‘)

    def tearDown(self):
        print(‘tearDown...‘)

    def test_init(self):
        d = Dict(a=1, b=‘test‘)
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, ‘test‘)
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d[‘key‘] = ‘value‘
        self.assertEqual(d.key, ‘value‘)

    def test_attr(self):
        d = Dict()
        d.key = ‘value‘
        self.assertTrue(‘key‘ in d)
        self.assertEqual(d[‘key‘], ‘value‘)

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):
            value = d[‘empty‘]

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

if __name__ == ‘__main__‘:
    unittest.main()

参考文档:http://www.liaoxuefeng.com/

时间: 2024-12-13 09:56:35

python 中__getattr__ 以及 __setattr__的相关文章

转载Python中__getattr__ __getattribute__ __get__解释

来源:http://www.myexception.cn/perl-python/620096.html python中__get__,__getattr__,__getattribute__的区别 __get__,__getattr__和__getattribute都是访问属性的方法,但不太相同. object.__getattr__(self, name) 当一般位置找不到attribute的时候,会调用getattr,返回一个值或AttributeError异常. object.__get

python中__getattr__和__getattribute__区别

重载__getattr__方法对类及其实例未定义的属性有效.如果访问的属性存在,就不会调用__getattr__方法.这个属性的存在,包括类属性和实例属性 class ClassA: x = 'a' def __init__(self): self.y = 'b' def __getattr__(self, item): return '__getattr__' if __name__ == '__main__': a = ClassA() print(a.x)# 输出结果 a # 使用实例直接

python中基于descriptor的一些概念(上)

@python中基于descriptor的一些概念(上) python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(new-style class) 2.3.1 __init__方法 2.3.2 __new__静态方法 2.4. 新式类的实例 2.4.1 Property 2.4.2 __slots__属性 2.4.3 __getattribute__方法

Python中的__init__,__call__

__init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不创建实例--它仅仅是你的对象创建后执行的第一个方法.它的目的是执行一些该对象的必要的初始 化工作.通过创建自己的 __init__() 方法,你可以覆盖默认的 __init__()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象__init__()需要一个默认的参数self,相当于this.

python中基于descriptor的一些概念(下)

@python中基于descriptor的一些概念(下) 3. Descriptor介绍 3.1 Descriptor代码示例 3.2 定义 3.3 Descriptor Protocol(协议) 3.4 Descriptor调用方法 4. 基于Descriptor实现的功能 4.1 property 4.2 函数和方法,绑定与非绑定 4.3 super 5. 结尾 3. Descriptor介绍 3.1 Descriptor代码示例 class RevealAccess(object):   

Python中的类(下)

本文将介绍一下类的构造函数和初始化函数,以及如何通过"魔术方法"定制一个类. 类构造和初始化 在前面的文章中,经常使用初始化函数"__init__",下面看看"__init__"和"__new__"的联系和差别. 下面先通过一段代码看看这两个方法的调用顺序: class A(object): def __init__(self,*args, **kwargs): print "init %s" %self.

django 中的延迟加载技术,python中的lazy技术

---恢复内容开始--- 说起lazy_object,首先想到的是django orm中的query_set.fn.Stream这两个类. query_set只在需要数据库中的数据的时候才 产生db hits.Stream对象只有在用到index时才会去一次次next. 例子: f = Stream() fib = f << [0, 1] << iters.map(add, f, iters.drop(1, f)) 1行生成了斐波那契数列. 说明: f是个lazy的对象,f首先放入

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对python的面向对象有了更加深入的了解.这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解

python 中面向对象编程简单总结3--定制类

声明:资源来自慕课网python学习课程,以下只是个人学习总结,仅供参考 1.Python类的特殊方法 特征:以  __ 开头并结尾的方法,比如用于print的__str__() , __getattr__(),__setattr__()等   不需要在代码中直接调用, Python的某些函数和操作符会自动调用. 可以自己定制实现,如__str__()方法 class Person(object): def __init__(self,name,gender): self.name = name