2012-09-13 136 views
2

說我們有一個類:Python類:添加動態屬性,方法

class Foo (object): 
...  def __init__(self,d): 
...   self.d=d 
...  def return_d(self): 
...   return self.d 

...和字典:

d={'k1':1,'k2':2} 

...和一個實例:

inst=Foo(d) 

有沒有辦法動態地將屬性添加到return_d如此:

inst.return_d.k1會返回1嗎?

+0

爲什麼'inst.return_d()['k1']'沒有? '.'運算符執行屬性查找,因此無論'return_d'返回什麼,都應該支持屬性查找,可能通過'__getattr__'掛鉤。請注意,您希望'return_d'是一個屬性,但你把它定義爲一個方法,所以這個例子中你的狀態就不會在該帳戶單獨工作。 –

+0

[?訪問字典鍵,如在Python屬性]的部分欺騙(http://stackoverflow.com/q/4984647) –

+0

@Pieter:它會做。這是一個愚蠢的例子,只是想更多地瞭解課堂以及我能做什麼和不能做什麼。 – root

回答

9

您需要做兩件事:聲明return_d作爲屬性或屬性,並返回允許字典鍵的屬性訪問的字典型對象。下面將工作:

class AttributeDict(dict): 
    __getattr__ = dict.__getitem__ 

class Foo (object): 
    def __init__(self,d): 
     self.d=d 

    @property 
    def return_d(self): 
     return AttributeDict(self.d) 

簡短演示:

>>> foo = Foo({'k1':1,'k2':2}) 
>>> foo.return_d.k1 
1 

property decorator轉方式進入屬性,並且__getattr__ hook允許AttributeDict類通過屬性的訪問(在.運營商)查找字典鍵。

+0

謝謝。很棒! – root

+0

字典類是否有可能會遮蓋的重要屬性? –

+0

'__getattr__'只徵詢沒有找到,否則屬性;字典對象上的方法使用相同的名字。 –