4

可能重复:
将函数参数分配给`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 方法是什么?

4

3 回答 3

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)
于 2012-11-19T22:28:59.583 回答
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())

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

于 2012-11-19T22:35:02.243 回答
0

你可以做这样的事情

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

但是每次实例化类时都必须命名所有实例变量。我认为这使代码更加脆弱。由于大多数人不喜欢脆弱的代码,他们坚持使用显式版本。

我想你可以为你的编辑器编写一个宏来扩展它们,但我认为不会有很大一部分时间花在那个细节上,而且并不是所有的类都希望将所有参数保存到实例中。

于 2012-11-19T22:34:56.670 回答