【问题标题】:Python: How to share data between instances of different classes?Python:如何在不同类的实例之间共享数据?
【发布时间】:2015-03-03 11:47:30
【问题描述】:
    Class BigClassA:
        def __init__(self):
            self.a = 3
        def foo(self):
            self.b = self.foo1()
            self.c = self.foo2()
            self.d = self.foo3()
        def foo1(self):
            # do some work using other methods not listed here
        def foo2(self):
            # do some work using other methods not listed here
        def foo3(self):
            # do some work using other methods not listed here

    Class BigClassB:
        def __init__(self):
            self.b = # need value of b from BigClassA
            self.c = # need value of c from BigClassA
            self.d = # need value of d from BigClassA
        def foo(self):
            self.f = self.bar()
        def bar(self):
            # do some work using other methods not listed here and the value of self.b, self.c, and self.d


    Class BigClassC:
        def __init__(self):
            self.b = # need value of b from BigClassA
            self.f = # need value of f from BigClassB
        def foo(self):
            self.g = self.baz()
        def baz(self):
            # do some work using other methods not listed here and the value of self.b and self.g

问题: 基本上我有 3 个有很多方法的类,从代码中可以看出它们有些依赖。如何将实例变量 self.b、self.c、self.d 的值从 BigClassA 共享到 BigClassB?

nb:这三个类不能相互继承,因为它没有意义。

我的想法,只是将所有方法组合成一个超级大类。但我觉得这不是正确的做法。

【问题讨论】:

  • class BigClassB(BigClassA):class BigClassC(BigClassA, BigClassB)。使用继承
  • 您可以尝试使用合成。那就是当您在 B 类的实例中实例化 A 类的对象时。这样您就拥有了连接,而无需说一个是另一个的特化。 Read here。除此之外,您可以发送 A 类的对象并将所需的属性分配给 B 类中的新属性。尽管这可能会破坏数据一致性。
  • 您想共享每个类实例的数据还是全局共享数据?
  • 每个实例不是全局的。

标签: python class instance-variables


【解决方案1】:

你是对的,在你的情况下继承没有意义。但是,如何在实例化期间显式传递对象。这很有意义。

类似:

Class BigClassA:
    def __init__(self):
        ..
Class BigClassB:
    def __init__(self, objA):
        self.b = objA.b
        self.c = objA.c
        self.d = objA.d

Class BigClassC:
    def __init__(self, objA, objB):
        self.b = objA.b # need value of b from BigClassA
        self.f = objB.f # need value of f from BigClassB

在实例化时,做:

objA = BigClassA()
..
objB = BigClassB(objA)
..
objC = BigClassC(objA, objB)

【讨论】:

  • 有意思,这是什么设计或图案?这是常见的事情还是有更好的方法来解决问题?
  • @user74158 这可能太常见了,甚至连名字都没有。
  • @user74158 这不是设计模式或任何东西。它只是实现您想做的事情的标准方法。这个想法是通过将依赖对象传递给__init__来建立显式依赖关系。
  • @DavidZ 回复。这可能“太常见以至于连名字都没有”,这会是inheritance 的一个例子吗?来自链接:class DerivedClassName(BaseClassName): 与上面不完全一样,但接近...
  • 名称是“接口”、“关注点分离”和“显式优于隐式”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2018-04-23
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多