面向对象 - 继承性
# cheer_xiong
# (`・ω・´) python
# IDE:就是用啥软件开发
# 继承
"""
就是新建类的一种方式,继承了一个类,类中的属性和方法就在子类中
父类/基类
子类/派生类
新式类 : 只要继承了object类,就是新式类,在py3中,默认都继承object类
在py2中,需要显示指定继承object
经典类 : 没有继承object类,就是经典类
py3中没有经典类
py2中才有
继承介绍:
如何使用继承
class 类名(父类)
pass
新式类和经典类
利用继承减少代码冗余
# 相同属性可以定义一个父类用来给其他子类调用,减少代码行数
# 并且调用还是和之前一样
重用父类查找方式一:
涉及到属性查找顺序 先找对象,对象没有去类中,找不到去父类,找不到就报错
但是涉及到多个父类继承,这个就引出以下
|
重用父类查找方式二:
类实例化就会自动调用__init__,如果没有,就去父类中找
多层继承:
class A:
a = 'aaa'
class B(A):
a = 'bbb'
class C(B):
a = 'ccc'
class D():
pass
# 往上一集查找
多继承:
class A:
a = 'aaa'
class B:
a = 'bbb'
class C:
a = 'ccc'
class D(A,B,C):
pass
# A->B->C 根据从左到右找
# 继承的菱形问题:
新式类和经典类是不一样的
*必须都继承一个类,并且不是object类,构成一个菱形*
新式类:广度优先,最后一个先不找,去找其他的,最后找最后一个
经典类:深度优先,一条道找到底
# mro 列表,继承顺序查找列表(只在新式类中有)
print(类名.mro())
print(类名.__mro__) # 相同
重用父类方法的第一种方式:
第一种方法和定义父类没有多大关系,因为定不定一都可以使用 指名道姓 的方式调用
和继承没有关系
class A:
def __init__(self, name, age):
self.name = name
self.age = age
class B:
def __init__(self, name, age, price):
A.__init__(self, name, age)
self.price = price
b = B('xc', 18, 100)
print(b.name)
print(b.age)
重用父类方法的第二种方式:
使用super(),需要继承父类才能调用父类的元素,
还有一点就是super是严格按照 mro 来找元素了。
class A:
def __init__(self, name, age):
self.name = name
self.age = age
class B(A):
def __init__(self, name, age, price):
super().__init__(name, age)
self.price = price
b = B('xc', 18, 100)
print(b.name)
print(b.age)
"""