【发布时间】:2015-04-22 17:43:33
【问题描述】:
以下是类及其关系:
http://i.imgur.com/HS5YrZZ.png
澄清代码:
class A(object):
def __init__(self):
self.atr = 1
class B(object):
def __init__(self):
self.atr = A()
class C(object):
def __init__(self):
self.atr = A()
class D(object):
def __init__(self):
self.atr1 = B()
self.atr2 = C()
test1 = D()
现在,如果我想以 A 的 self.atr = 2 的方式初始化 D,并且该更改反映到所有使用 @ 的类(B 和 C),我该怎么办当我初始化D时也是987654328@
就像我在伪代码中想象的那样:
test2 = D(A.self.atr = 2)
所以你初始化D 的方式是A 的self.atr = 2
【问题讨论】:
-
你没有。在良好的 OO 设计中,
D既不知道也不关心B和C在其实现中使用A。如果B或C需要修改他们的A实例,他们将在自己的__init__中提供这样做的方法。就此而言,A本身并没有提供在创建实例时为atr指定值的方法。 -
按照 chepner 的说法,唯一相似的可能是基类。 B 和 C 继承基类 A 的地方。那么它只是他们都拥有的属性。
-
@chepner 但是如果不允许这样做,你不会失去大量的效用吗?就像在我的例子中一样,如果 A 是一张卡片,B 是套牌,C 是玩家,D 是游戏,那么您可以轻松地生成 10 个游戏,每张卡片除了其他 9 个生成的游戏外,还具有独特的属性,因为当您生成 D(游戏)时,您可以通过更改卡片的类别(A),轻松地使游戏中的每张卡片具有独特的品质。我怎么能这样做?
-
至少,您首先让
A.__init__取一个值分配给atr,这样B和C可以在实例化A时分别传递一个值。然后,对B和C执行相同的操作,以便D在实例化B和C时可以传递一个值。 -
如果你想要更好的建议,你将不得不想出一个更具体的例子。就目前而言,我只能重申我之前的 cmets 和 jsbueno 的回答。
标签: python class oop python-3.x