初始化一个由许多类组成的类,其中一个类具有不同的属性

时间:2015-04-22 17:43:33

标签: python class oop python-3.x

以下是课程及其关系:

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

1 个答案:

答案 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”调用此工厂。这绝对是无法管理的,但它最终是你要求的。 Ť