【问题标题】:sync attributes between objects of different type在不同类型的对象之间同步属性
【发布时间】:2018-09-23 06:25:18
【问题描述】:

我有两个来自不同类的对象。什么是合理的设计选择来使一个属性反映另一个属性的变化?下面显示了一个无效的幼稚解决方案,希望能说明目标:

具体来说:

class A(object):
     def __init__(self):
         self.x = 'a original string'

class B(object):
     def __init__(self):
         self.x = 'b original string'

a = A()
b = B()

b.x = a.x
a.x = 'a modified string'

print('b.x = "{}" was not modified when a.x = "{}" was changed'.format(b.x, a.x))

【问题讨论】:

  • 你为什么要这样做?这个问题几乎总是XY problem,真正的问题比你想问的问题更容易和更有用。如果您的用例少数例外之一,那么了解它的不同之处将使编写特定的东西变得更容易,而不是有意义。
  • 您可以拥有多个副本,a1, a2, a3 = A(), A(), A()b1, b2, b3 = B(), B(), B()。您希望x 的分享程度如何? b2 如何知道它与哪个 aX 共享?
  • @tdelaney 大概是因为它知道因为那个赋值行——他写了b.x = a.x,他没有写b.x = a2.x。这在变量是左值而不是名称的语言中是有意义的,只是在 Python 中没有意义。

标签: python python-3.x oop properties attributes


【解决方案1】:

您真正需要的是一种将b.x 转换为对变量a.x 的某种引用的方法,而这与Python 变量的工作方式无关——变量在Python 中不是值,它们只是名字。

通常,它们都不合适,答案是合理的设计选择是一开始就不这样做。

但是,当您需要时,您可以通过多种方式进行模拟。哪一个——如果有的话——是合适的,取决于你真正想要做什么;对于一个玩具示例,它们都没有多大意义。所以我只展示一对。


最明显的方法是明确保留a 和名称'x'

class B:
    def __init__(self):
        self._x = 'b original string'
        self._a = None
    def set_a(self, a):
        self._a = a
    @property
    def x(self):
        if self._a is None:
            return self._x
        else:
            return self.a.x

a = A()
b = B()

b.set_a(a)
a.x = 'a modified string'

print('b.x = "{}" was modified when a.x = "{}" was changed'.format(b.x, a.x))

或者你可以用“可变持有者”替换字符串——最简单的选择是一个单元素列表——然后你可以改变名称绑定到的持有者,而不是将名称重新绑定到不同的东西:

class A(object):
     def __init__(self):
         self.x = ['a original string']

class B(object):
     def __init__(self):
         self.x = ['b original string']

a = A()
b = B()

b.x = a.x
a.x[0] = 'a modified string'

print('b.x[0] = "{}" was modified when a.x[0] = "{}" was changed'.format(b.x[0], a.x[0]))

或者您可以将两者结合起来,然后尝试对您的用户隐藏实现,但这既丑陋又具有误导性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多