2010-02-28 57 views
3

我應該在班級中重新定義什麼特殊方法(s?),以便它處理AttributeError的例外情況並在這些情況下返回特殊值?Python中的哪些特殊方法處理AttributeError?

例如,

>>> class MySpecialObject(AttributeErrorHandlingClass): 
     a = 5 
     b = 9 
     pass 
>>> 
>>> obj = MySpecialObject() 
>>> 
>>> obj.nonexistent 
'special value' 
>>> obj.a 
5 
>>> obj.b 
9 

我用Google搜索的答案,但無法找到它。

+0

注意'pass'這裏是不必要的。 – 2010-02-28 22:25:20

+0

歸因於'a'和'b'是您在實例'obj'上訪問的類屬性。這沒有什麼不妥,但這是不尋常的。你知道如何定義實例屬性嗎? – 2010-02-28 22:26:19

+0

@voyager,在您的編輯中,您發明了'AttributeErrorHandlingClass'作爲獲取回退屬性值的機制。這可能不是在特定班級中獲得此行爲的正確方法。 – 2010-02-28 22:27:59

回答

4

如何奧托Allmendinger使用__getattr__的例子overcomplicates它的使用。您只需定義所有其他屬性,並且如果缺少其中一個屬性,則Python將返回__getattr__

實施例:

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 
+0

這就是我在閱讀奧托的答案之前所做的。 :) 謝謝! – bodacydo 2010-02-28 21:33:04

1

您的問題對我而言並不清楚,但聽起來您正在尋找__getattr__,可能還有__setattr____delattr__

+0

哦。我想要做的是當對象沒有給定屬性時,它返回特殊值。 例如,假設'obj'具有屬性'a',則寫'obj.a'將返回'a'的值。但是,如果'obj'沒有屬性,比如'nosuch',那麼寫'obj.nosuch'就會返回'特殊值'值。 這個解釋是否有意義? – bodacydo 2010-02-28 21:02:21

1

你會覆蓋__getattr__,它的工作原理是這樣的:

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'. 
+0

感謝您告知有關問題!在我讀完完整的答案之前,我做了這樣的事情:class Foo(object):def __init __(self):self.attrx ='valx'... def __getattr __(self,attr):返回「特殊值」 !它應該還是應該不是真的有用? – bodacydo 2010-02-28 21:21:14

+0

「某種程度上工作」我的意思是當我訪問'foo_obj.attrx'它返回'valx',但是當我訪問'foo_obj.nonexist'它返回'特殊值'。 – bodacydo 2010-02-28 21:22:02

+0

這根本不是'__getattr__'的正確使用。如果已經定義了有意義的屬性,'__getattr__'與'__getattribute__'相反,所以你不必在'__getattr__'中查找普通屬性。 – 2010-02-28 21:27:49