假设您有一些类(Foo,Bar)定义了一些变量(可变对象和不可变对象的混合)。现在,还有另一个类FooBar可以改变Foo和Bar的值,为此他们需要适当地共享它们的引用。所以我想我可以想出以下内容:
def var_dict(object):
return {key:value for key, value in object.__dict__.items() if not key.startswith('__') and not callable(key)}
# Foo class
class Foo:
def __init__(self, **kwargs):
self.text = None
self.id = 0
def read(self):
input = FooBar(**var_dict())
# Bar class
class Bar:
def __init__(self, **kwargs):
self.id = None
self.l = list()
def read(self):
input = FooBar(**var_dict())
class FooBar:
def __init__(self, **kwargs):
self.text = kwargs.get("text",None)
self.id = kwargs.get("id",None)
self.l = kwargs.get("l",None)
def process(self):
if self.text:
print("text", self.text)
self.text = "text processed"
if self.id:
print("id", self.id)
if self.l:
# do further processing
self.l += ['processed']
获得了var_dict
函数from this post。现在,当我按如下方式尝试代码时:
f = Foo()
f.text = "foo"
f.id = 1
b = Bar()
b.id = 2
b.l = [1,2,3]
fb1 = FooBar(**var_dict(f))
fb1.process()
print(f.text)
print(f.id)
fb2 = FooBar(**var_dict(b))
fb2.process()
print(b.id)
print(b.l)
打印:
text foo
id 1
foo
1
id 2
2
[1, 2, 3, 'processed']
并且正如预期的那样,只有可变变量在原始类中发生了变化。所以我的问题是:有没有办法确保无论何时更改FooBar中的引用,这也会更改原始Foo和Bar类中的变量,而不管变量是可变的还是不可变的?另外,上面显示的**kwargs
是传递类之间引用的最Pythonic方法吗?