首页 > 解决方案 > 让子类从实例化的主类继承非默认的 __init__ 值

问题描述

我怎样才能有一个子类,它不仅继承__init__主类的变量,还继承实例化的主类的实例化值。

例如,假设我有这些课程:

class MainClass(object):
    def __init__(self, mainVar1=None, mainVar2=None):
        self.mainVar1 = mainVar1
        self.mainVar2 = mainVar2

class SubClass(MainClass):
    def __init__(self):
        super(SubClass, self).__init__()
        self.subVar1 = -1

我这样做:

main = MainClass(mainVar1=1, mainVar2=2)
sub = SubClass()
print(sub.mainVar1)

这会打印出来None,而不是1因为默认情况下设置为的sub调用。__init__MainClassmainVar1None

我想做的是以SubClass这样一种方式实例化,它获取用于实例化的输入值MainClass,以便print(sub.mainVar1)打印1而不是None.

我想在实例化类时不重复相同的变量:

main = MainClass(mainVar1=1, mainVar2=2)
# This is what I'm trying to avoid.
sub = SubClass(mainVar1=1, mainVar2=2)
print(sub.mainVar1)

这可能吗?这是一个糟糕的设计选择吗?最好的方法是什么?

编辑:

具体例子

我有一个类ServerTools,它提供了访问服务器上数据的功能。这是MainClass上面示例中的我的课程。要实例化这个类,我需要一个username,passwordserver_url.

然后我有一个名为的子类Docs,它从服务器上的数据创建一个文档。要实例化这个类,我需要username, password,server_url和其他一些参数。这个子类需要主类的函数ServerTools来访问服务器上的数据。

我的想法是Docs成为一个工具ServerTools,在其中没有实例化就无法创建文档ServerTools。我不确定是否Docs应该是子类、内部类或其他东西。

标签: pythonpython-2.7inheritance

解决方案


您可以使用 splat 和 splatty splat 运算符传递参数:

class SubClass(MainClass):
    def __init__(self, *args, **kwargs):
        super(SubClass, self).__init__(*args, **kwargs)
        self.subVar1 = -1

sub = SubClass(mainVar1=1, mainVar2=2)

请记住,这subMainClass通过继承的一个实例:isinstance(sub, MainClass)将返回True。您根本不需要单独的实例MainClass

作为一个扩展示例,即使您调用了一个方法并meth1MainClass其中覆盖了它SubClass,您仍然可以这样调用它:

MainClass.meth1(sub, ...)

推荐阅读