以下是课程及其关系:
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()
如果我想以D
' A
的方式初始化self.atr = 2
,我该怎么办,并且该更改会反映所有这些类({{我初始化B
时使用C
的1}}和A
}
就像我在伪代码中想象的那样:
D
因此,您以test2 = D(A.self.atr = 2)
' s D
A
答案 0 :(得分:1)
如果你希望B和C具有不同的属性,根据D的调用要求,那么这样做的方法是传递B和C初始化的参数,以便他们知道该怎么做。
参数本身可以是A的实例,其中您关注的属性在inistantiatin B和C之前设置:
class A(object):
def __init__(self, atr=1):
self.atr = atr
class B(object):
def __init__(self, config):
self.atr = config
class C(object):
def __init__(self, config):
self.atr = config
class D(object):
def __init__(self):
my_a = A(2)
self.atr1 = B(my_a)
self.atr2 = C(my_a)
test1 = D()
<强>更新强> 我从上面的评论中看到你似乎不喜欢这种方法,因为你会觉得你到处都有很多重复的代码 - 但事实并非如此 - 例如,如果您有很多类必须像A类一样“预先配置”,传递给许多其他类,您可以创建一个预先配置的所有类的包 - 您仍然会将单个参数传递给您创建的每个实例。
此外,正如你所愿,Python中的机制允许动态地重新配置类 - 使用“变量”作为其中之一 - 问题是以你想要的这种天真的方式做它,你很快就会很快无法维持的混乱。
例如,如果您只使用模块级(=全局)变量“1”而不是将其硬编码为A,则可以执行以下操作:
CURRENT_ATR_VALUE = 1
class A(object):
def __init__(self):
self.atr = CURRENT_ATR_VALUE
class B(object):
def __init__(self):
self.atr = A()
class C(object):
def __init__(self):
self.atr = A()
class D(object):
def __init__(self, atr):
global CURRENT_ATR_VALUE
old = CURRENT_ATR_VALUE
CURRENT_ATR_VALUE = atr
self.atr1 = B()
self.atr2 = C()
CURRENT_ATR_VALUE = old
test1 = D(atr=2)
这会产生你想要的确切效果,不可能更简单 - 不需要任何语言的高级内省功能,但仍会导致你很快陷入难以维持的混乱状态。传递参数的方式确实包含了他们想要的范围中的自定义值,没有副作用,即使在多线程或多处理运行环境中也是如此,并且更加可以推荐。
如果你真的想搞乱一下,你可以创建一个工厂函数来生成一个带有所需属性的 new 类“A”,并将它作为一个新的模块全局命名空间注入当你实例化其他人时,“A”级 - 这将是“更高级”,也许是你想要的。只需写一个类似的内容:
def A_factory(atr=1):
class A(object):
def __init__(self, atr=1):
self.atr = atr
globals()["A"] = A
# creates default "A" class
A_factory(1)
如上所述,在实例化“B”和“C”的同时,用您想要的“atr”调用此工厂。这绝对是无法管理的,但它最终是你要求的。 Ť