将对象传递给多个继承类的更好方法

时间:2018-06-02 14:02:16

标签: python class inheritance parameters

我想知道是否有更有效的方法将参数传递给所有子类都可以使用的父类。这是一个示例,其中myVar需要传递给a的所有子类。 (示例中只有子类是b)。我想知道是否有办法做到这一点,而不要求所有子类都作为参数传递myVar,其中myVar始终是同一个对象。也许有更高效系统的设计模式?感谢。

class a(object):
    def __init__(self, myVar):
        self.myVar = myVar

class b(a):
    def __init__(self, myVar):
        super(b, self).__init__(myVar)

class c(object):
    def __init__(self, a):
        print a.myVar

a = b(2)
d = c(a)

2 个答案:

答案 0 :(得分:2)

您可以通过几种不同的方式完成此操作,具体取决于您正在尝试做什么。
如果您没有为您的类定义__init__方法,它将自动继承父类的__init__方法。 E.g:

class A(object):
    def __init__(self, my_var):
        self.my_var = my_var

class B(A):
    pass

class c(object):
    def __init__(self, a):
        print(a.my_var)

a = B(2)
d = C(a)

如果您不想共享__init__方法,可以尝试在父类上定义默认值。

class A(object):

    DEFAULT_VALUE = 42

    def __init__(self, my_var=None):    
        self.my_var = my_var or self.DEFAULT_VALUE

class B(A):
    def __init__(foo, my_var=None):
        super(B, self).__init__(foo, my_var)

class c(object):
    def __init__(self, a):
        print(a.my_var)

a = B(2)
d = C(a)

或者,使用全局变量。注意事项。

MY_VAR = None


class A(object):

    def __init__(self, my_var=None):
        global MY_VAR
        if MY_VAR is None:
            MY_VAR = my_var
        elif my_var and MY_VAR != my_var:
            print("WARNING: Value of {my_var} for `my_var` being ignored")
        else:
            pass

        self.my_var = MY_VAR


class B(A):

    def __init__(self, foo, my_var=None):
        super(B, self).__init__(my_var)
        self._foo = foo


class C(object):

    def __init__(self, a):
        print(a.my_var)


a = A(42)
b = B("bar")
c = C(b)

答案 1 :(得分:1)

您可以将myVar声明为类变量:

class a(object):
    myVar = 2
    def __init__(self):
        ...

class b(a):
    def __init__(self):
        super(b, self).__init__()

class c(object):
    def __init__(self, a):
        print(a.myVar)

a = b()
d = c(a)