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
writing
obj.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
作为获取回退属性值的机制。这可能不是在特定类中获得这种行为的正确方法。