1
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()但我不明白如何使用它访问方法内部的变量。我也将非常感谢回答如何在不使用继承的情况下做到这一点。

4

2 回答 2

2

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

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

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

Foo也许您应该创建一个返回列表的类级吸气剂?

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

    @classmethod
    def get_list_one(cls):
        return [1, 2, 3]
于 2012-09-24T19:57:35.580 回答
2

不可能做你描述的确切事情。self是对 的实例的引用Foo,并且在类被实例化之前不存在;并且list_one是 的一个属性,在它已经被创建之后self分配给它。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

请注意,两个版本的bar引用不同的值a,每个值都是在调用时创建foo(5)的。foo(6)

于 2012-09-24T19:58:25.313 回答