如何在类之间正确共享变量引用

时间:2014-09-19 11:34:04

标签: python reference kwargs

假设您有一些类(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方法吗?

0 个答案:

没有答案