- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试理解下面的代码。
class Base(object):
def __init__(self):
print(self.__class__.__name__)
def handle(self):
print("Beginning handle Base")
self.template()
def template(self):
print("template of Base")
class Child(Base):
def __init__(self):
super(Child, self).__init__()
def handle(self):
print("Beginning handle Child")
super(Child, self).handle()
def template(self):
print("template of Child")
parent = Base()
child = Child()
在这里我希望打印以下内容
'Base'
'Child'
这很好,除非我这样调用:
parent.handle()
child.handle()
我希望:
"Beginning handle Base"
"template of Base"
"Beginning handle Child"
"Beginning handle Base"
"template of Base"
但是我得到了
"Beginning handle Base"
"template of Base"
"Beginning handle Child"
"Beginning handle Base"
"template of Child"
为什么会这样? Base的handle函数中的self.template()不是指的是base的模板函数吗? super(Child, self).handle()
实际上在做什么?对我来说,它似乎是在调用其父级的句柄,但将自身设置为自身......
最佳答案
super(type[, object-or-type])
Return a proxy object that delegates method calls to a parent or sibling class of type. This is useful for accessing inherited methods that have been overridden in a class. The search order is same as that used by getattr() except that the type itself is skipped.
所以在你的情况下 super(Child, self).handle() 做下一步:
调用 Child
(即 Base
)父级的 handle
方法并将 Child
实例作为 传递>self
到那个方法。
看看您的代码片段中发生了什么:
parent.handle()
// Calling handle of parent, nothing special.
// "Beginning handle Base"
// "template of Base"
child.handle()
// Calling handle of child: "Beginning handle of Child" - logged
// handle method of child calls handle method of parent: "Beginning handle Base" - logged
// handle method of Base calls template method of self which is template method of Child as self passed to super as second parameter.: "template of Child" - logged
所以这是上面代码片段的正常行为。
关于python - 在对 child 调用 super 时理解什么是 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35099099/
问题比较Java,但是我想在Android中实现: 假设有 3 个或更多类相互扩展: class A { ... int color; ... } class B extend
我知道标题听起来有点奇怪,但这正是我愿意做的。简单解释:A类是B类的子类,B类也是C类的子类>. 现在,所有这些类都包含方法m()。在我的 A 类中,这是我唯一可以访问的类,因为其他类仅在运行时可用,
我有一个 UIViewController 类 A 和 B。 A 使用以下方式加载 B:[A.view addSubView B.view]。 B 有一个带有“后退”按钮的导航栏。我想在单击时返回到
我有以下(第三方)类结构。我们将调用第三方项目 ProjectSeriously,并注意我使用 System.out.println 代替其他复杂的功能(100 行代码) . class A {
在下面的代码中,我从 Game 扩展了 MyGame。我有两个问题: 我们是否需要为所有render()、dispose()、pause()调用super方法 和 resize(w,h)?很多人都没有
例如,假设我想在调用 super.viewDidLoad() 时跳过一级。所以我希望能够做这样的事情: override func viewDidLoad() { super.super.vi
public class Faculty extends Employee { public static void main(String[] args) { new Fac
假设我有: class Superclass { //fields... methodA() {...} methodB() {...} ... } class Subclass exte
这个问题在这里已经有了答案: Why is super.super.method(); not allowed in Java? (22 个答案) 关闭 9 年前。 我怀疑我想做的事情是否可行。我有
我有一个实现 Initializable 的类。 public abstract class ExampleClass implements Initializable { public vo
我想知道,我有这个大数组,是否可以只在内存中使用一次而不是每个线程一次?以 stackoverflow 上的标签为例。他们几乎从不改变,为什么不为他们留下一个内存点呢?甚至可能将该数组永久保存在内存中
假设这三个类具有这个简单的层次结构: class A { func foo() { print("A") } } class B: A { override fu
有没有办法在 TypeScript 中调用 super.super.methodName。我想避免调用super.methodName,但我想调用二祖的methodName方法。 谢谢。 最佳答案 T
这个问题已经有答案了: When do I use super()? (11 个回答) 已关闭 7 年前。 package Geometry; public abstract class Geomet
我必须执行and()在我的实现 Predicate 的业务对象上. 出现问题的代码是 and() 行调用: Predicate predicate = new M
我有一个实现接口(interface)的抽象父类(super class): public abstract class FooMatrix implements Matrix { publi
我有四个 UIView:viewA 是 Root View ,它有 viewB 作为它的 subview 。 viewB 将 viewC 作为其 subview ,而 viewC 将 viewD 作为
有什么区别: class Child(SomeBaseClass): def __init__(self): super(Child, self).__init__() 和:
我有一个通用接口(interface) interface ListList extends List> .由于某些原因,我无法转换 ListList至 List> .有什么方法可以做到吗?为什么它不
我想调用带有两个参数的父类(super class)的构造函数,所以我调用了 super(arguments),但是编译器说: “类 Person 中的构造函数 Person 不能应用于给定类型; 要
我是一名优秀的程序员,十分优秀!