2012-09-13 137 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__'只征询没有找到,否则属性;字典对象上的方法使用相同的名字。 –