Python中有什么特殊方法处理AttributeError?
我应该在类中重新定义什么特殊方法,以便它处理Python中有什么特殊方法处理AttributeError?,python,attributeerror,Python,Attributeerror,我应该在类中重新定义什么特殊方法,以便它处理AttributeErrors异常,并在这些情况下返回特殊值 比如说, >>> class MySpecialObject(AttributeErrorHandlingClass): a = 5 b = 9 pass >>> >>> obj = MySpecialObject() >>> >>> obj.nonexistent
AttributeError
s异常,并在这些情况下返回特殊值
比如说,
>>> class MySpecialObject(AttributeErrorHandlingClass):
a = 5
b = 9
pass
>>>
>>> obj = MySpecialObject()
>>>
>>> obj.nonexistent
'special value'
>>> obj.a
5
>>> obj.b
9
我在谷歌上搜索答案,但找不到。你的问题我不清楚,但听起来你好像在寻找
\uuuu getattr\uuuu
,可能是\uu setattr\uuuuu
,以及\uu delattr\uuuuuu你必须重写\uu getattr\uuuuuuu
,它的工作原理如下:
class Foo(object):
def __init__(self):
self.bar = 'bar'
def __getattr__(self, attr):
return 'special value'
foo = Foo()
foo.bar # calls Foo.__getattribute__() (defined by object), returns bar
foo.baz # calls Foo.__getattribute__(), throws AttributeError,
# then calls Foo.__getattr__() which returns 'special value'.
Otto Allmendinger关于如何使用\uuu getattr\uuuu
的示例使其使用过于复杂。您只需定义所有其他属性,如果其中一个属性缺失,Python将求助于\uuu getattr\uuu
例如:
class C(object):
def __init__(self):
self.foo = "hi"
self.bar = "mom"
def __getattr__(self, attr):
return "hello world"
c = C()
print c.foo # hi
print c.bar # mom
print c.baz # hello world
print c.qux # hello world
哦我想做的是,当对象没有给定的属性时,它返回特殊的值。例如,假设obj
具有属性a
writingobj.a
返回a
的值。但是当obj
没有属性时,比如nosuch
,那么写入obj.nosuch
将返回值特殊值。这个解释有意义吗?谢谢你告诉我关于哥特的事!在阅读您的完整答案之前,我做了以下操作:类Foo(对象):def uuu init uuuu(self):self.attrx='valx'。。。def\uu getattr\uuu(self,attr):返回'special value',它以某种方式工作了!它到底应该工作还是不应该工作?我所说的“以某种方式工作”是指当我访问foo_obj.attrx
时,它返回valx
,但当我访问foo_obj.nonexist
时,它返回了“特殊值”。这根本不是\uu getattr\uuu
的正确用法\uuuu getattr\uuuu
与\uuuu getattribute\uuuu
相反,如果已经定义了有意义的属性,那么code>\uuuuuu getattr\uuuuu
@Bodacydo中的普通属性将作为回退方法运行,因此您不必在\uuuu getattr\uuuuuuu
@Bodacydo中查找普通属性:是的,我描述的问题不适用于您的情况。首先调用uuu getattribute_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuugetattr_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
,当抛出异常时,调用异常。请注意这里不需要传递。属性化的a
和。这没什么错,但很不寻常。您了解如何定义实例属性吗?@voyager,在您的编辑中,您发明了AttributeErrorHandlingClass
作为获取回退属性值的机制。这可能不是在特定类中获得这种行为的正确方法。