我正在为__getattr__苦苦挣扎。我有一个复杂的递归代码库,其中让异常传播很重要。classA(object):@propertydefa(self):raiseAttributeError('lala')def__getattr__(self,name):print('attr:',name)return1print(A().a)结果:('attr:','a')1为什么会有这种行为?为什么不抛出异常?此行为未记录(__getattr__documentation)。getattr()可以只使用A.__dict__。有什么想法吗? 最佳答案
Python的setdefault允许您从字典中获取一个值,但如果该键不存在,则您分配基于参数default.然后,您可以获取字典中键所在的任何内容。不操纵对象的__dict__对象有类似的功能吗?例如我有一个对象foo可能有也可能没有属性bar.我该怎么做:result=setdefaultattr(foo,'bar','bah') 最佳答案 请注意,如果该属性尚不存在,当前接受的答案将调用hasattr()、setattr()和getattr()。仅当OP执行了覆盖setattr和/或getattr之类的操作时,这才是必要的——
如果您想动态创建和引用嵌套属性,最好采用什么方法?我正在编写一个简单的Flickr客户端,并希望尽可能接近记录的API,而不是实际定义每个方法。例如,向Flickr的flickr.people.getInfoAPImethod发出请求:flickr=Client()data=flickr.people.getInfo(user_id='xxx')在这种情况下,flickr.people.getInfo直接映射到其API文档中的相应方法。调用时,people和getInfo会在查找时创建,然后要发出的正确请求由getInfo的路径决定,该路径是people.getInfo。这是我使用的方
如果您想动态创建和引用嵌套属性,最好采用什么方法?我正在编写一个简单的Flickr客户端,并希望尽可能接近记录的API,而不是实际定义每个方法。例如,向Flickr的flickr.people.getInfoAPImethod发出请求:flickr=Client()data=flickr.people.getInfo(user_id='xxx')在这种情况下,flickr.people.getInfo直接映射到其API文档中的相应方法。调用时,people和getInfo会在查找时创建,然后要发出的正确请求由getInfo的路径决定,该路径是people.getInfo。这是我使用的方
考虑这段代码:classFoo1(dict):def__getattr__(self,key):returnself[key]def__setattr__(self,key,value):self[key]=valueclassFoo2(dict):__getattr__=dict.__getitem____setattr__=dict.__setitem__o1=Foo1()o1.x=42print(o1,o1.x)o2=Foo2()o2.x=42print(o2,o2.x)我希望得到相同的输出。但是,对于CPython2.5、2.6(与3.2类似),我得到:({'x':42},42
考虑这段代码:classFoo1(dict):def__getattr__(self,key):returnself[key]def__setattr__(self,key,value):self[key]=valueclassFoo2(dict):__getattr__=dict.__getitem____setattr__=dict.__setitem__o1=Foo1()o1.x=42print(o1,o1.x)o2=Foo2()o2.x=42print(o2,o2.x)我希望得到相同的输出。但是,对于CPython2.5、2.6(与3.2类似),我得到:({'x':42},42
我正在使用getattr根据变量调用不同的函数。我正在做类似的事情:getattr(foo,bar)()这行得通,调用诸如foo.bar()之类的函数我的问题是我有'bar'函数,我想用不同的参数调用它。例如:deff1():passdeff2(param1):passdeff3(param1,param2):pass所以“bar”可以是f1、f2或f3我试过这个:假设params是一个列表,其中包含'bar'函数所需的所有参数getattr(foo,bar)(forpinparams:)我正在寻找一个“干净”的解决方案,无需查看params变量的长度 最佳
我正在使用getattr根据变量调用不同的函数。我正在做类似的事情:getattr(foo,bar)()这行得通,调用诸如foo.bar()之类的函数我的问题是我有'bar'函数,我想用不同的参数调用它。例如:deff1():passdeff2(param1):passdeff3(param1,param2):pass所以“bar”可以是f1、f2或f3我试过这个:假设params是一个列表,其中包含'bar'函数所需的所有参数getattr(foo,bar)(forpinparams:)我正在寻找一个“干净”的解决方案,无需查看params变量的长度 最佳
这个问题在这里已经有了答案:Howtoaccessobjectattributegivenstringcorrespondingtonameofthatattribute(3个回答)关闭3年前。我有一个带有pseudo或special属性的对象,可以用三种不同的方式命名(注意:我不控制生成对象的代码)属性中的值(取决于设置哪一个)完全相同,我需要获取它以进行进一步处理,因此根据数据源,我可以有类似的东西:>>>obj.a'value'>>>obj.bTraceback(mostrecentcalllast):File"",line1,inAttributeError:Objinstan
这个问题在这里已经有了答案:Howtoaccessobjectattributegivenstringcorrespondingtonameofthatattribute(3个回答)关闭3年前。我有一个带有pseudo或special属性的对象,可以用三种不同的方式命名(注意:我不控制生成对象的代码)属性中的值(取决于设置哪一个)完全相同,我需要获取它以进行进一步处理,因此根据数据源,我可以有类似的东西:>>>obj.a'value'>>>obj.bTraceback(mostrecentcalllast):File"",line1,inAttributeError:Objinstan