python - 从未传递给 __init__ 方法的类继承属性
问题描述
好的,假设我正在创建一个这样的类和一个子类:
class A:
def __init__(self, list1=[], list2=[]):
self.list1 = []
self.list2 = []
class B(A):
def __init__(self, list2=[]):
super().__init__(list2)
但是,有没有办法像这样实现它
class A:
def __init__(self):
self.list1 = []
self.list2 = []
class B(A):
# code here to inherit list1 or list2 from class A
基本上,一种实现它的方法,因此用户不能为 list1 和 list2 提供值(它们将被初始化为空列表,用户可以稍后使用某种方法添加元素)并让 B 类从 A 类继承一个列表
我觉得除了我的解决方法之外还有其他方法可以做到这一点,但可能不是因为这是一个非常具体的问题
解决方案
您提供的代码已经完成了您希望它执行的操作。
class A:
def __init__(self):
self.list1 = []
self.list2 = []
class B(A):
pass
b = B()
print(b.list1) # prints []
当你继承一个类时,你继承了它的所有方法,包括__init__
. 因此,A.__init__
is (隐式)在初始化时调用B
。大致相当于
class A:
def __init__(self):
self.list1 = []
self.list2 = []
class B(A):
def __init__(self):
super().__init__()
这意味着(几乎)相同的事情。你永远不会为了更明确而这样做;只有当你想添加不应该有的行为时B.__init__
,你才会这样做。A.__init__
推荐阅读
- docker - 高山卡夫卡“OpenSSL 在构建时不可用”
- flutter - Getx 等待构建列表
- .net - 将 RDLC 纸张尺寸高度设置为自动
- json - 电源自动化 json
- node.js - discord bot返回无效的交互应用程序命令和interactionCreate未接收
- ethereum - 如何转移 ERC721 代币
- firebase - “用户?”类型的值 无法从方法“_userFromFirebaseUser”返回,因为它的返回类型为“用户”
- flutter - Android Studio 一直告诉我工厂类需要一个主体,有什么问题吗?
- c++ - PJSIP 接收到远程 Sip 标头
- django - 在 Django 休息框架的视图中使用相同的序列化程序类但具有不同的操作