python __getattr__ 巧妙应用】的更多相关文章

在之前的文章有提到__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, 如果没有定义这个函数,那么抛出AttributeError异常.由此可见,__getattr__一定是作用于属性查找的最后一步,兜底. 我们来看几个例子:   第一个例子,很简单但经典,可以像访问属性一样访问dict中的键值对. class ObjectDict(dict): def __init_…
实例属性的获取和拦截, 仅对实例属性(instance, variable)有效, 非类属性 getattr: 适用于未定义的属性, 即该属性在实例中以及对应的类的基类以及祖先类中都不存在 1. 动态处理事先未定义的属性, 可更好的实现数据隐藏, 当调用dir(obj)时只会显示初始化定义的正常的属性和方法 getattribute: 对于所有属性的访问都会调用该方法, 当属性不存在时会报错 1. 覆盖该方法之后,任何属性的访问都会调用用户自定义的__getattribute__()方法, 性能…
传送门 https://docs.python.org/3/reference/datamodel.html#object.__getattr__ https://docs.python.org/3/reference/datamodel.html#object.__getattribute__ https://stackoverflow.com/questions/4295678/understanding-the-difference-between-getattr-and-getattri…
Python是非常有吸引力的编程语言,学习Python的不是帅哥就是美女.为什么这么说呢?因为我和我的女朋友都是学习Python认识的,小编肯定是帅哥,不用去怀疑,而且我眼光特高. 给大伙讲一个故事,先问大家,你们身边有没有那种可以入侵学校内网的?讲道理,你身边没有你就肯定不是个敲代码的,至少现在还不是.我前几天还碰到个在学校自学Java入侵学校内网的,还是个十九岁的小伙.我那时的同学更厉害,Python轻松入侵学校图书馆,九层楼瞬间停电,漆黑一片! Java在用作于黑客方面肯定是没有Pytho…
1.__getattr__ 方法的作用:当调用不存在的属性,就会调用__getattr__()方法: 当一般位置找不到attribute的时候,会调用getattr,返回一个值或AttributeError异常. class abc(): def __getattr__(self, item): print item abc().test 那么它能干什么呢? sdk的链式调用就可以用它来实现 结果: class Dir(object): def __init__(self, path="&quo…
class Rectangle: def __init__(self): self.width = 0 self.height = 0 def __setattr__(self, key, value): if key == 'size': self.width, self.height = value else: self.__dict__[key] = value def __getattr__(self, item): if item == 'size': return self.widt…
__getattr__ 这个魔法函数会在类中查找不到属性时调用 class User: def __init__(self): self.info = 1 def __getattr__(self, item): return 'not found attribute' if __name__ == "__main__": user = User() print(user.test) __getattribute__ class User: def __init__(self): se…
本节知识点 1.__get__, __getattr__, __getattribute__的区别 2.__getattr__巧妙应用 3.延迟初始化(lazy property) 1.__get__, __getattr__, __getattribute__的区别 obj.__getattribute__(self, name) 在实例访问属性的时候无条件被调用.如果class中定义了__getattr__(),__getattr__()也不会被调用,除非显示的调用或者没有访问到属性引发At…
1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static/pythonds/index.html)时写下的阅读记录,当然,也结合了部分[算法导论]( http://en.wikipedia.org/wiki/Introduction_to_Algorithms)中的内容,此外还有不少wikipedia上的内容,所以内容比较多,可能有点杂乱.这部分主要是介…
原题地址:https://oj.leetcode.com/problems/permutations/ 题意: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. 解题思路:穷举一个集合的全排列.这个就…
的确,正如偶像Bruce Eckel所说,"Life is short, you need Python"! 如果你正在考虑学Java还是Python的话,那就别想了,选Python吧,你的人生会有更多的时间做其他有意思的事情. 研究生之前我没学python是有原因的:首先,我怕蛇,很怕很怕,而这货的logo竟然就是蛇,我因故而避之:其次,我不喜欢脚本语言,我会shell,但是写的时候不是很爽,只是在处理些文件操作或者字符串操作的时候才会想起它,听说python脚本神马的,我便又避之.…
实python非常适合初学者入门,上手很容易.我就是完全通过网上资源学了python的.最大的是3点经验:1.找一本浅显易懂,例程比较好的教程,从头到尾看下去.不要看很多本,专注于一本.把里面的例程都手打一遍,搞懂为什么.2.去找一个实际项目练手.我当时是因为要做一个网站,不得已要学python.这种条件下的效果比你平时学一门新语言要好很多.所以最好是要有真实的项目做.可以找几个同学一起做个网站之类.3.最好能找到一个已经会python的人.问他一点学习规划的建议,然后在遇到卡壳的地方找他指点.…
代码: #!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): return "xxx" obj = A() 执行操作的代码: 代码1: print(obj.__dict__) 结果: {} # 空字典 代码2: print(obj.na…
27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属性中: __dict__ 为字典,键为属性名,值是属性本身. 例子: class bird(object): feather = True # 父类 class chicken(bird): fly = False def __init__(self, age): self.age = age #…
python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = obj.attribute value = getattr(obj, "attribute") 使用`getattr`来实现工厂模式 #一个模块支持html.text.xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出 import statsout…
一:最基本的属性操作 class Generic: pass g= Generic() >>> g.attribute= "value" #创建属性并赋值 >>> g.attribute 'value' >>> g.unset Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeEr…
200 ? "200px" : this.width)!important;} --> 介绍 我们可以通过for循环来迭代list.tuple.dict.set.字符串,dict比较特殊dict的存储不是连续的,所以迭代(遍历)出来的值的顺序也会发生变化.     迭代(遍历) #!/usr/bin/env python3 #-*- coding:utf-8 -*- vlist=['a','b','c'] vtuple=('a','b','c') vdict={'a': 1, '…
__getattr____getattr__在当前主流的Python版本中都可用,重载__getattr__方法对类及其实例未定义的属性有效.也就属性是说,如果访问的属性存在,就不会调用__getattr__方法.这个属性的存在,包括类属性和实例属性. Python官方文档的定义 Called when an attribute lookup has not found the attribute in the usual places (i.e. it is not an instance a…
object._getattr_(self, name) 拦截点号运算.当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法.如果继承树可以找到该属性,则不调用此方法 实例instance通过instance.name访问属性name,只有当属性name没有在实例的__dict__或它构造类的__dict__或基类的__dict__中没有找到,才会调用__getattr__.当属性name可以通过正常机制追溯到时,__getattr__是不会被调用的.如果在__getat…
  #!/usr/bin/env python # -*- coding: utf-8 -*- import sys __metaclass__ = type """ __getattr__ 和 __getattribute__ 的区别 """ class ClassName: def __init__(self, name, info={}): self.name = name self.info = info # def __getattri…
python class 通过内置成员dict 存储成员信息(字典) 首先用一个简单的例子看一下dict 的用法 class A(): def __init__(self,a,b): self.a = a self.b = b def f(self): print (self.__dict__) a = A(1,2) a.f() 输出结果:{‘b’: 2, ‘a’: 1} 我们可以通过重载getattr和setattr来拦截对成员的访问或者作出一些自己希望的行为getattr 在访问对象访问类中…
getattr 在访问对象的属性不存在时,调用__getattr__,如果没有定义该魔法函数会报错 class Test: def __init__(self, name, age): self.name = name self.age = age def __getattr__(self, item): print(item) // noattr return 'aa' test = Test('rain', 25) print(test.age) // 25 print(test.noatt…
python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单吧: 首先来看看上述三个魔法方法的定义吧: (1)__getattr__(self, item): 在访问对象的item属性的时候,如果对象并没有这个相应的属性,方法,那么将会调用这个方法来处理...这里要注意的时,假如一个对象叫fjs,  他有一个属性:fjs.name = "fjs",…
原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? 在协程中,我将上下文理解为“操作执行时需要的一个特定的执行环境“.在该环境中,“上文”提供该操作需要的变量等信息,“下文“对操作执行返回的结果进行进一步的处理. 比如:   def add(a, b):   op = '+'   result = yield cal(op, a, b)   prin…
通常情况下,我们在访问类或者实例对象的时候,会牵扯到一些属性访问的魔法方法,主要包括: ① __getattr__(self, name): 访问不存在的属性时调用 ② __getattribute__(self, name):访问存在的属性时调用(先调用该方法,查看是否存在该属性,若不存在,接着去调用①) ③ __setattr__(self, name, value):设置实例对象的一个新的属性时调用 ④ __delattr__(self, name):删除一个实例对象的属性时调用 为了验证…
@Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): self.name = 'zhangjing'   #self.age='24' def method(self): print"method print&quo…
一.isinstance(obj,cls)和issubclass(sub,super)                                isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(F…
python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就可以用字典的属性了. 我们通过使用dir()属性来看看__dict__都有哪些属性. ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '…
一.内置attr:__setattr__,__delattr__,__getattr__ __setattr__ #添加/修改属性会触发它的执行 __delattr__ #删除属性的时候会触发 __getattr__ #只有在调用属性且属性不存在的时候才会触发 class Foo: def __init__(self,x): self.name=x def __setattr__(self, key, value): # if not isinstance(value,str): # raise…
python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def __init__(self): self.name = 'A' def hello(self): print('hello') def __getattribute__(self, item): print('获取属性,方法',item) return object.__getattribute__(…