- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我正在使用一个提供以下类的库:
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print("B")
super().__init__()
然后我定义了一个 mixin 和一个子类:
class C:
def __init__(self):
print("C")
super().__init__()
class D(B, C):
def __init__(self):
print("D")
super().__init__()
创建一个新的D
的输出是
D
B
A
我的目标是在初始化 D 时也调用 C 的 __init__
,不能修改 B 或 A。期望的输出将是
D
B
A
C
使用super
多重继承有各种各样的问题,比如this one和 this one .来自 this post ,我知道要使合作子类化模式起作用,并且要调用 C.__init__
,B
和 A
也需要调用 super
,它将按方法解析顺序返回 C
。 Hettinger 建议编写一个适配器类来处理这种“不合作”的情况。我可以为 B 编写适配器类,但与 Hettinger 的示例不同,B 是我继承的主要类,而不是混合类。我的理解是,我必须“重写”B 在其适配器中实现的每个方法才能正常工作,这似乎是不可行的,特别是如果 B 是一个大型库类,将来可能会改变行为。
那么有没有办法在不适应B或A的情况下获得C的初始化行为?
最佳答案
mixins 的第一条黄金法则:
始终首先继承mixin。
适当的 mixin 旨在支持多重继承,即它们有一个带有 *args, **kwargs
的构造函数调用 super().__init__(*args, **kwargs)
(或者他们根本没有构造函数)。像这样的构造函数是完全透明和不引人注意的;它不会妨碍子类的构造函数。
当子类 (D
) 调用 super().__init__()
时,它会调用 mixin 的 (C
)构造函数,它将依次调用 B
的构造函数。换句话说,您的问题只需重新排序 D
的父类即可解决。
class D(C, B):
def __init__(self):
print("D")
super().__init__()
D() # output: D C B A
如果出于某种原因,你绝对必须按 D B A C
的顺序调用构造函数,你应该显式调用父类的构造函数,而不是 super ()
:
class D(B, C):
def __init__(self):
print("D")
B.__init__(self)
C.__init__(self)
D() # output: D B A C
关于python - 适应具有多重继承的非合作父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48452702/
有什么创意可以在不执行 O/S Thread.Sleep(10) 的情况下通过合作/非抢占式多任务处理来避免 yield 或 sleep 上的死锁?通常 yield 或 sleep 调用将回调到调度程
我在 httpd.conf 中取消注释了以下行: LoadModule php5_module libexec/apache2/libphp5.so 当我转到任何 php 页面时,文件会下载而不是显示
我正在创建一个新的支付应用程序。我有一个客户端应用程序,用户可以选择价格,输入其身份验证信息,然后客户端创建 iso 8583 消息并将此数据发送到银行服务器。 根据我的研究,我可以使用 jPOS 来
我正在尝试这个简单的代码: import java.util.List; import com.orientechnologies.orient.core.exception.OStorageExce
当我去列表时,这将像这样弹出子列表。这是使用 Chrome 和 Opera。但是在火狐浏览器中是这样显示的。 HTML代码 Categories Printing Mate
尝试使用 bc 对数组中的元素求和,我有一个包含名称和其值的文件,如果名称出现 3 次,我应该将其值乘以 3,然后找到所有元素的总和,我看到标准输入错误 $ cat foo.txt max 2.3 h
一般来说,是否有一个接口(interface)表明TransactionScope-awareness?是否有利用 TransactionScope 的常用数据库列表? (它是扩展 DbConnect
我想知道为什么没有确定的方法来处理 Jackson。我只想解析 JSON 字符串: ObjectMapper mapper = new ObjectMapper(); Customer[] myObj
Expo是很棒的。它的目标之一是仅使用 javascript 来编写 React Native 应用程序。 您如何确定第三方 React Native 库是否可以在 Expo 开发环境中工作? 最佳答
我有一个 Rad 组合框和 2 个 RadGrid - grvUser 和 grvRole grvUser RadGrid如下...
我一直在努力 Unsafe JavaScript attempt to access frame with URL http://lolfantasy.net/ from frame with URL
我有这种电子邮件表 id | url | id1 | id2 | mail_date | message 我的行示例 id | url | id1 | id2 | mail_date | messag
我正在尝试弄清楚如何使用委托(delegate)和协议(protocol)。 我有一个 MessageFetcher 类,它从 url 中获取消息。 class MessageFetcher { f
所以我已经尝试了几个星期让 GLFW3 与 MinGW 一起工作(通过 Code::Blocks IDE),但每次都失败了。我在每个 glfw 参数中都得到了一大堆“ undefined refere
当我写这段代码时,我在 Scala 中遇到编译错误 var s: Stack[_ ,这显然是一个错误。 这解释了为什么做 x :: xs不危险。现在来解释为什么它会打字: :: 的签名在 List[
我刚开始一个非常简单的项目,并尝试同时使用 ButterKnife 和 Jack 编译器,但它们似乎不能很好地相互配合。 Gradle插件版本:2.2.0-alpha5 在我的模块 build.gra
我一直在关注本指南(并通过 Composer 安装了所有内容):http://docs.behat.org/cookbook/behat_and_mink.html并试图让 Behat + Mink
我无法让 Google 的 Repo、gerrit 和 Jenkins 一起工作。 我们的设置: 我们有一个由几个 git 存储库构建的 Repo,它们都在我们的 gerrit 服务器上。 list
我使用 iText 库来创建并操作 PDF 文档。让我们有一个包含简单字符串的文档,例如“Hello world”。所以在pdf文件结构中,我们必须有(Hello world)Tj。问题是我如何通过使
我在 Jasper 中为 noto-sans 字体 ( https://www.google.com/get/noto/#sans-lgc ) 创建了一个字体扩展,并将其添加到我的类路径中。我的应用程
我是一名优秀的程序员,十分优秀!