zoukankan      html  css  js  c++  java
  • Day7 类的继承和继承实现的原理

    继承可以分为但继承,多继承。

     1 继承的基本形式
     2 class ParentClass1(object): #定义父类
     3     pass
     4 
     5 class ParentClass2: #定义父类
     6     pass
     7 
     8 class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
     9     pass
    10 
    11 class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    12     pass
    13 
    14 
    15 
    16 
    17 print(SubClass1.__bases__)   #显示他继承了几类
    18 print(SubClass2.__bases__)
    19 print(ParentClass1.__bases__)

    经典类和新式类:

    两者区别在python3中是没有区别的,都有有个继承,如果没定义继承,也会默认将object继承,都叫新式类。

    两者的区别在python2才有区别,没有定义就是经典类,如果定义了继承就是新式类。

     1 class Animal:
     2     x=1
     3     def __init__(self,name,age,sex):
     4         self.name=name
     5         self.age=age
     6         self.sex=sex
     7         # print('Animal.__init__')
     8     def eat(self):
     9         print('%s eat' %self.name)
    10 
    11     def talk(self):
    12         print('%s say' %self.name)
    13 
    14 class People(Animal):
    15     x=10
    16     def __init__(self,name,age,sex,education):
    17         Animal.__init__(self,name,age,sex)
    18         self.education=education
    19         # print('People.__init__')
    20 
    21     def talk(self):
    22         Animal.talk(self)
    23         print('这是人在说话')
    24 
    25 class Dog(Animal):
    26     pass
    27 class Pig(Animal):
    28     pass
    29 
    30 
    31 peo1=People('alex',18,'male','小学肄业')
    32 print(peo1.__dict__)
    33 peo1.talk()
    34 print(peo1.x)
    35 
    36 dog1=Dog('yuanhao',28,'male')
    37 pig1=Pig('wupeiqi',18,'male')
    38 
    39 
    40 print(peo1.name)
    41 print(dog1.name)
    42 print(pig1.name)

    类的继承:

     1 class OldboyPeople:
     2     school = 'oldboy'
     3     def __init__(self,name,age,sex):
     4         self.name=name
     5         self.age=age
     6         self.sex=sex
     7 
     8     def eat(self):
     9         print('is eating')
    10 
    11 class OldboyStudent(OldboyPeople):
    12     def learn(self):
    13         print('%s is learning'  %self.name)
    14 
    15 
    16 class OldboyTeacher(OldboyPeople):
    17     def __init__(self,name,age,sex,salary,title):
    18         OldboyPeople.__init__(self,name,age,sex)
    19         self.salary=salary
    20         self.title=title
    21 
    22     def teach(self):
    23         print('%s is teaching'  %self.name)
    24 
    25 
    26 yl_obj=OldboyStudent('yanglei',28,'female')
    27 egon_obj=OldboyTeacher('egon',18,'male',3.1,'沙河霸道金牌讲师')


    总结;

    1,继承功能之一:解决类与类之间代码重复

    2,继承是类与类之间的关系,是一种,什么是什么的关系

    3,在子类派生出新的属性,以自己的为准。

    4,在子类派生出新的方法内重用弗雷的功能的方式:指名道姓

    eg:OldboyPeople.__init__

      这种调用方法本身跟继承没有关系

    继承实现的原理:

    调用顺序:

    单继承的话:如果执行的话先找自己的范围内,当没有的时候再去找父类。(就是不管怎么找,都是先从自身找齐)

     1 #单继承
     2 class A:
     3     def f1(self):
     4         print('A.f1')
     5 
     6     def f2(self):
     7         print('A.f2')
     8         self.f1() #b.f1()
     9 
    10 class B(A):
    11     def f1(self):
    12         print('B.f2')
    13 
    14 
    15 b=B()
    16 # b.f2=111111
    17 b.f2()

    多继承的话:

     1 #多继承
     2 class J:
     3     def test(self):
     4         print('J')
     5 class A(J):
     6     # def test(self):
     7     #     print('A')
     8     pass
     9 class E(J):
    10     def test(self):
    11         print('E')
    12     pass
    13 class H(J):
    14     def test(self):
    15         print('H')
    16 
    17 class G(H):
    18     def test(self):
    19         print('G')
    20     pass
    21 class B(A):
    22     # def test(self):
    23     #     print('B')
    24     pass
    25 class D(E):
    26     def test(self):
    27         print('D')
    28     pass
    29 class F(G):
    30     def test(self):
    31         print('F')
    32     pass
    33 class C(B,D,F):
    34     # def test(self):
    35     #     print('C')
    36     pass
    37 
    38 c=C()
    39 # c.test=1111
    40 c.test()
    41 
    

    #可以利用*.mro()来查看他的调用顺序

    eg: print(c.mro())

  • 相关阅读:
    react-native ios打包和Android打包
    用create-react-app创建的react项目怎么解决打包体积过大
    react native 新建项目运行报错
    微信分享等配置,微信授权失败讲解
    微信公众号的code,微信授权
    linux 递归删除指定文件
    mariaDB安装 无密码就可以登录、远程访问、及新版本初始化密码
    mysql 可重复插入、创建语句
    redis数据库入门
    Extjs 3.4 同值合并
  • 原文地址:https://www.cnblogs.com/sexiaoshuai/p/7372067.html
Copyright © 2011-2022 走看看