#面向对象的三大特性:继承 多态 封装
class Animal:
breath = '呼吸'
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print('动物都需要进食....')
class Person(Animal): # 括号里面的Animal是Person的父类,基类,超类 括号外面的Person是子类,派生类.
pass
# 初识继承:子类以及子类实例化的对象 可以访问父类的任何方法或变量.
# 类名可以访问父类所有内容
print(Person.breath)
Person.eat(111)
#子类实例化的对象也可以访问父类所有内容
p1=Person('alex','mal',20)
print(p1.breath)
p1.eat()
class Animal:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def eat(self,a1):
print('%s吃%s' % (self.name,a1))
def drink(self):
print('%s喝东西' % (self.name))
class Cat(Animal):
def miaow(self):
print('喵喵叫')
# def eat(self): # 只执行自己类中的方法
# print(666)
class Brid(Animal):
def __init__(self, name,sex,age,wing): # self b1对象 name '鹦鹉',sex '公',age 20, wing '绿翅膀'
#方法一:
Animal.__init__(self, name, sex, age) #类名调用方法,这几个参数是实参,执行Anilmal中共有属性
self.wing = wing #执行Bird中特有属性
#方法二:
super().__init__(name,sex,age) # super(Brid,self).__init__(name,sex,age)
self.wing = wing
def eat(self,argv):
super().eat(argv)
print('鸟吃虫子...')
b1 = Brid("鹦鹉","公",20,"绿翅膀")
print(b1.__dict__)
b1.eat("金蝉")
"""
鹦鹉吃金蝉
鸟吃虫子...
"""
总结:
# 只执行父类的方法:子类中不要定义与父类同名的方法
# 只执行子类的方法:在子类创建这个方法.
# 既要执行子类的方法,又要执行父类的方法:
"""
方法一:
class Brid(Animal):
def __init__(self, name,sex,age,wing):
Animal.__init__(self, name, sex, age)
self.wing = wing
"""
"""
方法二:(常用)
class Brid(Animal):
def __init__(self, name,sex,age,wing):
super().__init__(name,sex,age) #super(Brid,self).__init__(name,sex,age)
self.wing = wing
#super()作用:为了在子类中调用父类的方法,自动执行父类__init__,并将__init__()中的参数传给子类,除self不会传入
"""
继承: 单继承,多继承
#单继承: 新式类,经典类查询顺序一样.
#多继承:
# 新式类: 遵循广度优先. 一条路走到倒数第二级,判断,如果其他路能走到终点,则返回走另一条路.如果不能,则走到终点
# mro方法查看继承顺序
# py3 默认继承object 所以py3都是新式类
# super().func() 遵循mro算法,在类的内部不用传子类名和self
# py2 需要主动继承object
# super(子类名,self).func() 必须传子类名和self
# 经典类: 遵循深度优先. 一条路走到底.
# py2 不继承object,默认都是经典类
# 没有mro
有关深度优先和广度优先在继承两个类情况下是严格遵循的
继承好处:
1、优化代码 节省代码
2、提高代码复用性
3、提高代码维护性
4、让类与类之间发生联系
例子:
b = B()
b.func() #打印的是A B
#方法:画继承图,如果是多继承,根据MRO方法找顺序