2011-05-17 73 views
3

也许我在问错误的问题。我有这样的代码:什么是设置类变量的pythonic方法?

class ExpressionGrammar(Grammar): 
    def __init__(self, nonterminals, terminals, macros, rules, precedence, nonterminal_name = '_expr'): 
    self.nonterminals = nonterminals 
    self.terminals = terminals 
    self.rules = rules 
    self.macros = macros 
    self.precedence = precedence 
    self.nonterminal = nonterminal 

我觉得它是多余的总是必须self.x = x。我知道python试图避免重复,那么做这种事情的正确方法是什么?

+0

就是这样。也许你对初始化器有很多争论,这就是为什么它看起来很奇怪。 – 2011-05-17 03:00:15

+0

Rafe是对的。如果你传递了很多变量,为什么不传递一个字典呢? – Falmarri 2011-05-17 03:09:26

回答

9

可避免这样做,与类似:

class C(object): 
    def __init__(self, x, y, z, etc): 
     self.__dict__.update(locals()) 

那么所有这些参数成为成员(包括self参数)。所以你可以删除它:self.__dict__.pop('self')

我不知道pythonic这种方法是如何,但它的作品。

PS: 如果你想知道什么__dict__是,它持有一个实例的每一个成员的形式{'member1': value, 'member2': value}

locals()是返回与局部变量的字典功能的字典。

+0

酷!每天学点新东西 – Scott 2011-05-17 03:08:10

+0

这会使用'__slots__'在班上工作吗? – detly 2011-05-17 03:43:08

+0

不会。当你声明'__slots__'时,Python会移除'__dict__'元素。顺便说一句,当你有一个类的实例太多时,你应该只使用'__slots__',并且你关心内存使用情况。 – JBernardo 2011-05-17 03:48:27

1

你总是可以这样做:

self.__dict__.update(locals()) 
+2

这样的事情给python一个坏名字。 – Falmarri 2011-05-17 03:08:01

相关问题