首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

__getattr__

正常情况下,当调用类的方法或属性时,如果不存在,就会报错 要避免这个错误,除了可以加上那个要调用但不存在的属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性...只有在没有找到属性的情况下,才调用__getattr__,已有的属性会直接在类属性里查找,不会在__getattr__中查找 class Student(object):...def __init__(self): self.name = 'Michael' def __getattr__(self, attr):...Student() print(s.name) #输出:'Michael' print(s.score) #输出:99,当调用不存在的score属性时,Python解释器会调用__getattr...这样就会返回score的值 s.age() #输出:25,返回函数也是完全可以的 print(s.abc) #输出:None,任意调用如s.abc都会返回None,因为定义的__getattr

55310
您找到你想要的搜索结果了吗?
是的
没有找到

Python 魔法方法之__getattr__(self,name)

前言 当实例对象调用一个不存在的属性时,系统通常会报错,那有啥办法避免这种现象么,或者说自定义报错信息,答案是肯定的,我们可以通过定义__getattr__(self,name)魔法方法来实现。...__getattr__(self, name) __getattr__(self,name) 定义当用户获取一个不存在的属性时的行为。...__(self,name)方法,一旦属性查找失败,就会调用__getattr__(self,name)方法: >>> class Animal(): ......def __getattr__(self,name): ......这边也来说下调用__getattr__的详细过程: 1.在对象的实例属性中寻找,找不到执行下一步2.在的类中查找类属性,找不到执行下一步3.在对象的继承链上寻找,找不到执行下一步4.调用__getattr

1.4K20

__setattr__,setattr(),getattr__,getattr()及__getattribute__的区别

name赋值时候自动被调用,其余方法同理 #相当于触发机制 __getattribute__(self,item) #每次通过实例化访问属性都会通过该函数 #如果没有该属性,则访问完该函数后,再会通过__getattr...__setattr__(self, key, value)#正常设置呗 def __getattr__(self, name): try: print "__getattr__被调用" return object...凡是对属性进行设置的都会进入__setattr__()中 print "---------c.name--------" print c.name#动态建立属性name,本身在class中不存在,故才调用__getattr...-----c.value1------- 0 -----------c----------- __str__被调用 Python cost : 0 ---------c.Type-------- __getattr...__getattribute__(self, *args, **kwargs) def __getattr__(self, name): print("__getattr__() is called "

32520

从 Python 的魔法方法说开去

_proc = proc def __getattr__(self, name): return getattr(self....然而,_wrap_close却定义了__getattr__()魔法方法,这样所有其他找不到的属性、方法就会传递给self._stream对象,而这个对象有__next__()方法。这就解释了为什么r....下面这段是额外的思考,可能比较绕: 再回头去看最开始的例子,这个问题之所以奇怪,是因为它用了__getattr__()让实例获得了并不存在于类中的属性。也就是说,原来的类并没有获得这些额外的属性。...这两件事合起来看,那我是不是可以通过元类中的__getattr__()方法让类获得本不属于它的魔法方法,继而使得实例具有某些行为呢?...明明Foo能获取到__next__()属性,看来(Py_TYPE(obj)->tp_iternext并不会触发__getattr__

13120

django源码分析 LazySetti

__方法,则根据__getattr__方法获取属性 在python中类属性和实例属性会记录在类的一个内置变量__dict__中,类属性和实例属性有各自维护的__dict__ class A: a...__方法,实例属性中和类属性中都找不到时,就会使用这个方法获取属性 aa Bb cc 3. django的LazySetting类的实现 LazySetting类的实现就是通过定义__getattr__...方法实现的,LazySetting类的__getattr__源码如下 def __getattr__(self, name): """Return the value of a setting...__dict__)中查找,没有找到话,通过__getattr__方式获取,获取到后,将属性值保存到实例属性中,这样就实现了属性在使用的时候 再获取,然后保存。...我们还可以再获取属性之前,先将属性的值自定义,这样就可以不用使用__getattr__的方式来获取默认的值。

29510
领券