我正在研究Dusty Philip的“Python 3面向对象编程”,顺便提一下,我正在研究钻石继承问题。从概念上讲,它是一块蛋糕,但有一个代码片段,我不是100%肯定我理解。
class BaseClass(object):
num_base_calls = 0
def call_me(self):
print('Calling method on Base Class')
self.num_base_calls += 1
class LeftSubClass(BaseClass):
num_left_calls = 0
def call_me(self):
BaseClass.call_me(self)
print("Calling method on Left Subclass")
self.num_left_calls += 1
class RightSubClass(BaseClass):
num_right_calls = 0
def call_me(self):
BaseClass.call_me(self)
print("Calling method on Right Subclass")
self.num_right_calls += 1
class SubClass(LeftSubClass,RightSubClass):
num_sub_calls = 0
def call_me(self):
LeftSubClass.call_me(self)
RightSubClass.call_me(self)
print("Calling method on SubClass")
self.num_sub_calls += 1
我的问题是,为什么对子类中基类的所有调用都包含self参数?据我所知,如果我们创建了一个对象实例:
a = BaseClass()
a.call_me()
应该有效,因为self参数是隐含的。那么为什么在子类中我们需要
BaseClass.call_me(self)?
严格来说,是因为我们还没有创建BaseClass的实例而是创建SubClass的实例,因此如果从子类中调用BaseClass.call_me(),则没有隐式的self参数传递给它?
答案 0 :(得分:1)
在这种情况下,您将self(当前类实例)作为参数传递给父类,以便它可以使用它,保存它或以其他方式访问它。通常这实际上会被称为BaseClass(self,self),但在这种情况下,它可以被读作* which_base_class * .function(param),尤其是在最后一个例子中。
重要的是要注意,示例是部分,因为没有__init__(self)
类成员,每个类self
只是另一个没有特殊含义的名称。
理想情况下,该示例应使用super
和新样式类 - 值得阅读this文章以及documents on super。