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()
,但我无法理解如何使用它访问方法内的变量。我也非常感谢如何在不使用继承的情况下做到这一点。
答案 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_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
更一般地说,除了在执行方法或函数期间,或者在引用函数创建的 closure 时,引用“方法内的变量”并没有什么用处。每次调用函数时,都会创建一个新的命名空间,并在该命名空间内重新创建局部变量名。
但是,一旦调用了函数,就可以引用它们。例如:
bar
观察a
的两个版本引用foo(5)
的不同值,每个值都是在调用foo(6)
和{{1}}时创建的。