2012-11-19 67 views
4

可能重复:
Assign function arguments to `self`一个公共的构造

我常常有构造函数如下所示:

class Foo(object): 
    def __init__(self,a,b,c): 
    self.a = a 
    self.b = b 
    self.c = c 

我在想,如果有一个便捷的方式来编码这样的构造函数。也许看起来像这样:

class Foo(object): 
    SOME_MACRO_LIKE_THINGY_THAT_SPECIFIES_THE_CONSTRUCTOR(a,b,c) 

它会表现完全像上面的原始代码。

什么使我原来的版本错误是,我必须写三次Foo的每个实例变量(一次作为参数,一次作为self.a,再次作为赋值给self.a的值)。

我想这不是什么大不了的事情,但我觉得代码看起来更整齐,重复性更低。

什么是Pythonic方式来处理这种情况?

+3

坦率地说,我喜欢原始/普通/标准的方式。我每天看到它几十次。我确切知道它是如何工作的以及它是如何工作的。这是一个地方国际海事组织,其中一个额外的抽象将大大减损你的代码的可读性。现在我必须去挖掘你可能会跳过蟒蛇魔术来做出令人惊奇的事情的宏观事物。 –

回答

2

这很奇怪,但你可以使用__slots__来实现这一目标:

class Base(object): 
    def __init__(self, *args, **kw): 
     for k,v in zip(self.__slots__, args): 
      setattr(self, k, v) 

     for k,v in kw.items(): 
      setattr(self, k, v) 

class ChildA(Base): 
    __slots__ = 'a', 'b', 'c' 

class ChildB(Base): 
    __slots__ = 'x', 'y', 'z' 

你也使用以下方法给自己节省一些打字,有很多的参数初始化类时:

def autoargs(l): 
    self = l.pop('self') 
    for k,v in l.items(): 
     setattr(self, k, v) 

class Base(object): 
    def __init__(self, a, b, c): 
     autoargs(locals()) 

我希望我能正确理解你的问题。

+0

闪回:'autoargs'片段来自[O'Reilly的Python食谱,第二版](http://shop.oreilly.com/产品/ 9780596007973.do) - 由于它涵盖了Python 2.3和2.4,这本书仍然令人惊讶地相关。 – gvalkov

2

你可以做Foo和所有其他作为主类的子类,即

class MasterObject(object): 
    def __init__(self,a,b,c): 
    self.a = a 
    self.b = b 
    self.c = c 


class Foo(MasterObject): 
    def __init__(self,a,b,c): 
    MasterObject.__init__(a,b,c) 
+1

甚至使用'** kwargs'和'setattr' ...哦,这让我很难过。 –

+0

这是真的,这当然可以做得更一般,但概念仍然是一样的 –

0

你可以做这样的事情

class Foo(object): 
    def __init__(self, **kw): 
     self.__dict__.update(kw) 
     del self.__dict__["self"] 

但你必须说出所有的实例变量每次你实例化这个类。我认为这会让代码更加脆弱。由于大多数人不喜欢脆弱的代码,他们坚持使用明确的版本。

你可以为你的编辑器编写一个宏来扩展它们,但我认为在这个细节上花费的时间不是很多,并不是所有的类都想把所有的参数保存到实例中。

相关问题