在没有实例化的情况下合并__init__中的两个列表。蟒蛇

时间:2012-09-24 19:48:51

标签: python class variables

class Foo(object):
    def __init__(self):
        self.list_one = [1, 2, 3]


class Bar(object):
    def init(self):
        self.list_two = Foo.list_one + [4, 5, 6] # I know this won't work unless I 
                                                 # make list_one a class level variable

所以,问题是 - 有没有办法合并这些列表而不实例化Foo或使list_one成为类级变量?

也许有一种方法可以使用继承和super(),但我无法理解如何使用它访问方法内的变量。我也非常感谢如何在不使用继承的情况下做到这一点。

2 个答案:

答案 0 :(得分:2)

没有极端的字节码hackery,没有 - 不可能从函数中提取一个值并在另一个函数中使用它。

此外,由于Bar不是Foo的子类,并且Python对使用显式self调用实例方法施加了相当任意的类型检查限制,因此不能做一些明智的事情,如:

class Bar(object):
    def __init__(self):
        Bar.__init__(self)
        self.list_one += [4, 5, 6]

也许你应该在Foo上创建一个类级别的getter来返回列表?

class Foo(object):
    def __init__(self):
        self.list_one = self.get_list_one()

    @classmethod
    def get_list_one(cls):
        return [1, 2, 3]

答案 1 :(得分:2)

不可能做你描述的确切事情。 self是对Foo实例的引用,在实例化类之前不存在; list_oneself的属性,在self创建之后已分配给list_one。因此,在实例化类之后,class Foo(object): def __init__(self): self.list_one = [1, 2, 3] class Bar(Foo): def init(self): super(Bar, self).__init__() self.list_two = self.list_one + [4, 5, 6] # if you want to discard list_one, you can, but that seems wrong somehow # del self.list_one 根本不存在。

使用继承执行您所要求的操作非常简单,但是:

>>> def foo(x):
...     a = x
...     def bar():
...         print a
...     return bar
... 
>>> bar1 = foo(5)
>>> bar2 = foo(6)
>>> bar1()
5
>>> bar2()
6

更一般地说,除了在执行方法或函数期间,或者在引用函数创建的 closure 时,引用“方法内的变量”并没有什么用处。每次调用函数时,都会创建一个新的命名空间,并在该命名空间内重新创建局部变量名。

但是,一旦调用了函数,就可以引用它们。例如:

bar

观察a的两个版本引用foo(5)的不同值,每个值都是在调用foo(6)和{{1}}时创建的。