python基础课程第12章_流畅的python学习笔记-第12章

第12章-类继承

super函数

Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承。

Py 3.x 中类的继承可以直接使用 super() 关键字代替原来的 super(Class, self)。

那么 super() 到底是依据什么来继承的呢?

super()函数根据传进去的两个参数具体作用如下:

通过第一参数传进去的类名确定当前在MRO中的哪个位置。MRO(Method Resolution Order)

通过第二个参数传进去的self,确定当前的MRO列表。

class A(object):

def name(self):

print('name is xiaoming')

# super(A, self).name()

class B(object):

def name(self):

print('name is cat')

class C(A, B):

def name(self):

print('name is wang')

super(C, self).name()

if __name__ == '__main__':

c = C()

print(c.__class__.__mro__)

c.name()

返回结果是:

(, , , )

name is wang

name is xiaoming

如果把注释去掉的结果是:

(, , , )

name is wang

name is xiaoming

name is cat

再看一个例子:

class Base(object):

def func_1(self):

print('this is base')

class A(Base):

def func_1(self):

super().func_1()

print('this is A')

class B(Base):

def func_1(self):

super().func_1()

print('this is B')

class C(A, B):

def func_1(self):

super().func_1()

print('this is c')

print(C.mro())

C().func_1()

print(help(C))

返回结果:

Help on class C in module __main__:

class C(A, B)

| Method resolution order:

| C

| A

| B

“从左到到右”的意思,C继承关系最近的是A, 然后是B,最后是上层BASE。

调用方法时的入栈顺序是 C A B Base,

出栈顺序是Base B A C,

class Base(object):

def __init__(self):

print("Base created")

class ChildA(Base):

def __init__(self):

Base.__init__(self)

class ChildB(Base):

def __init__(self):

# super(ChildB, self).__init__()

# 或者更简单的写法

# super().__init__()

# 如果不用super写法就要这样写

print("self=", self) # <__main__.childb object at>

mro = type(self).mro()

print(mro)

# [, , ]

for next_class in mro[mro.index(ChildB) + 1:]:

print(next_class) #

if hasattr(next_class, '__init__'):

next_class.__init__(self)

break

print(ChildA())

print("#" * 10)

print(ChildB())

问题

看下面的代码:

class Base(object):

def __init__(self):

print("Base created")

class ChildA(Base):

def __init__(self):

print("ChildA init...")

Base.__init__(self)

class ChildB(Base):

def __init__(self):

print("ChildB init..")

# super(ChildB, self).__init__()

# 或者更简单的写法

super().__init__()

if __name__ == "__main__":

print(ChildA())

print("#" * 10)

print(ChildB())

返回值:

ChildA init...

Base created

##########

ChildB init..

Base created

可以看到结果是一样的,那么 Base.__init__(self) 和 super().__init__()

有什么区别呢?

请看这个例子:

class Base(object):

def __init__(self):

print("Base created")

class UserDependency(Base):

def __init__(self):

print("UserDependency init...")

super().__init__()

class ChildA(Base):

def __init__(self):

print("ChildA init...")

Base.__init__(self)

class ChildB(Base):

def __init__(self):

print("ChildB init..")

# super(ChildB, self).__init__()

# 或者更简单的写法

super().__init__()

class UserA(ChildA, UserDependency):

def __init__(self):

print("UserA init...")

super(UserA, self).__init__()

class UserB(ChildB, UserDependency):

def __init__(self):

print("UserB init...")

super(UserB, self).__init__()

if __name__ == "__main__":

print(UserA())

print("#" * 10)

print(UserB())

返回结果:

UserA init...

ChildA init...

Base created

##########

UserB init...

ChildB init..

UserDependency init...

Base created

这里我们看到了区别,在多重继承中,没有使用super方法的类,没有调用UserDenpendency方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值