【发布时间】:2012-09-10 18:52:36
【问题描述】:
关于super() 的用法有很多问题,但似乎都没有回答我的问题。
当从子类调用super().__init__() 时,超构造函数中的所有方法调用实际上都取自子类。考虑以下类结构:
class A(object):
def __init__(self):
print("initializing A")
self.a()
def a(self):
print("A.a()")
class B(A):
def __init__(self):
super().__init__()
# add stuff for B
self.bnum=3 # required by B.a()
def a(self):
print("B.a(), bnum=%i"%self.bnum)
b=B()
失败了
initializing A
Traceback (most recent call last):
File "classmagic.py", line 17, in
b=B()
File "classmagic.py", line 11, in __init__
super().__init__()
File "classmagic.py", line 5, in __init__
self.a()
File "classmagic.py", line 15, in a
print("B.a(), bnum=%i"%self.bnum)
AttributeError: 'B' object has no attribute 'bnum'
这里我调用B()中的超级构造函数来初始化一些基本结构(其中一些作为自己的函数a()执行)。但是,如果我也重写 a() 函数,则在调用 A 的构造函数时会使用此实现,但由于 A 对 B 一无所知,并且可能使用不同的内部变量,因此会失败。
这可能很直观,也可能不直观,但是当我希望 A 中的所有方法都只能访问那里实现的功能时,我该怎么办?
【问题讨论】:
标签: python oop superclass