python - 让子类从实例化的主类继承非默认的 __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__
MainClass
mainVar1
None
我想做的是以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
,password
和server_url
.
然后我有一个名为的子类Docs
,它从服务器上的数据创建一个文档。要实例化这个类,我需要username
, password
,server_url
和其他一些参数。这个子类需要主类的函数ServerTools
来访问服务器上的数据。
我的想法是Docs
成为一个工具ServerTools
,在其中没有实例化就无法创建文档ServerTools
。我不确定是否Docs
应该是子类、内部类或其他东西。
解决方案
您可以使用 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)
请记住,这sub
是MainClass
通过继承的一个实例:isinstance(sub, MainClass)
将返回True
。您根本不需要单独的实例MainClass
。
作为一个扩展示例,即使您调用了一个方法并meth1
在MainClass
其中覆盖了它SubClass
,您仍然可以这样调用它:
MainClass.meth1(sub, ...)
推荐阅读
- javascript - 在 X 轴上平移几次,然后在 Y 轴上平移会使 HTML 对象向后移动
- mysql - 为什么我在 Excel 中使用字符串作为参数的 MySQL 查询不起作用?
- java - 如何避免Springboot Camel Route每天因特定时间挂断信号而关闭
- azure-devops - 当并行阶段仍在运行时任务失败时,Azure Devops 是否可以发送邮件
- python - Python 中的 7z subprocess.Popen FileNotFoundError
- javascript - React JS - 刷新同一页面后获取页面顶部
- sql - 仅在更改时才进行 SQL MERGE
- amazon-web-services - 有没有办法让 aws ecs run-task 使用网络默认值?甚至在 AWS::ECS::TaskDefinition 中定义网络设置?
- c++ - 使用 ar 在 Makefile 中组合静态库
- vue.js - 从数据库数据动态创建 Vuex getter