继承

今日内容大纲

  1. 初识继承

字面意思:儿子完全可以使用父类的所有内容

专业角度: 如果 B类继承 A类,B 类就称为子类,派生类

A类就称为父类,基类,超类

面向对象的三大特性之一:继承,封装,多态

2.继承的优点

1.减少代码的重复性

2.增加类之间的耦合性

3.代码更加清晰,流畅

3.单继承

1.类名执行父类属性方法

2.对象执行父类属性方法

3.在子类中既执行子类方法又执行父类方法

class Animal:

#

#     def __init__(self, name, sex, age):

#

#         self.name = name

#         self.age = age

#         self.sex = sex

#

#

# class Human(Animal):

#     pass





# class Dog(Animal):

#     pass

#

#

# class Cat(Animal):

#     pass





# class Cat(object):

#     pass
cat1 = Cat()
# Human,Dog,Cat 子类,派生类.
# Animal 父类,基类,超类.

# person = Human('李业', '男', 18)
# print(person.name)

4.多继承

1.经典类:不继承 object 类,深度优先原则

2.新式类:继承 object 类.mro(c3)算法

class A(object):

#     pass







# class A:

#     pass

#

#

# class B(A):

#     pass

#

# class C(B):

#     pass





# class A:

#     pass

#

#

# class B(object):

#     pass
 class ShenXian:

#

#     def fly(self):

#         print('神仙都会飞')

#

#     def walk(self):

#         print('神仙会走路')

#

# class Monkey:

#

#     def climb(self):

#         print('猴子都会爬树')

#

#     def walk(self):

#         print('猴子会走路')

#

# class SunWuKong(ShenXian,Monkey):

#     pass

#

# sun = SunWuKong()

# # sun.fly()

# # sun.climb()
# sun.walk()

# 经典类: 深度优先.从左至右,深度优先.
class O:

    name = '太白'



class D(O):

    pass



class E(O):

    name = '李业'

    # pass

class F(O):

    name = '宝元'



class B(D,E):

    pass



class C(E,F):

    pass



class A(B,C):

    pass
obj = A()

print(obj.name)



# mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )

# mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C])



'''

mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C])



mro(B(D,E)) = [B] + merge(mro(D),mro(E),[D,E])



mro(B(D,E)) = [B] + merge([D,O],[E,O],[D,E])

mro(B(D,E)) = [B,D] + merge([O],[E,O],[E])

mro(B(D,E)) = [B,D,E] + merge([O],[O])

mro(B(D,E)) = [B,D,E,O]



mro(C) = [C,E,F,O]



mro(A(B,C)) = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])

            = [A,B] + merge([D,E,O],[C,E,F,O],[C])

            = [A,B,D] + merge([E,O],[C,E,F,O],[C])

            = [A,B,D,C] + merge([E,O],[E,F,O])

            = [A,B,D,C,E] + merge([O],[F,O])

            = [A,B,D,C,E,F,O] 

           



'''
# print(A.mro())
单继承课堂练习
class Base:
    def __init__(self, num):
        self.num = num
    def func1(self):
        print(self.num)

class Foo(Base):
    pass
obj = Foo(123)  # 实例化一个对象
obj.func1()    # Foo 里找不到就去父类找  
#  123
class Base:
    def __init__(self, num):
        self.num = num

    def func1(self):
        print(self.num)

class Foo(Base):

    def func1(self):
        print("Foo. func1", self.num)

obj = Foo(123)
print(obj.__dict__)
# obj.func1()
# {'num': 123}
# Foo. func1 123
class Base:
    def __init__(self, num):
        self.num = num
    def func1(self):
        print(self.num)
class Foo(Base):
    def func1(self):
        print("Foo. func1", self.num)
obj = Foo(123)
obj.func1()
#  Foo. func1 123
class Base:
#
    def __init__(self, num):
        self.num = num

    def func1(self):  # self= obj
        print(self.num)  # 123
        self.func2()  # obj.func2()

    def func2(self):
        print("Base.func2")

class Foo(Base):
    def func2(self):
        print("Foo.func2")

obj = Foo(123)
obj.func1()
123
Foo.func2
class Base:
    def __init__(self, num):
        self.num = num

    def func1(self):
        print(self.num)
        self.func2()

    def func2(self):
        print(111, self.num)

class Foo(Base):
    def func2(self):
        print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
    obj.func2()
111 1
111 2
222 3
class Base:
#     def __init__(self, num):
#         self.num = num
#
#     def func1(self):  # self = Foo(3)
#         print(self.num)
#         self.func2()
#
#     def func2(self):
#         print(111, self.num)
#
# class Foo(Base):
#     def func2(self):
#         print(222, self.num)
#
# lst = [Base(1), Base(2), Foo(3)]
#
# for obj in lst:
#     obj.func1()


1
111 1
2
111 2
3
222 3
posted @ 2019-08-10 11:03  挂机兄  阅读(93)  评论(0编辑  收藏  举报