python类继承和派生,python2中面向对象的多继承是

  python类继承和派生,python2中面向对象的多继承是

  本章内容

  一.继承

  第二,抽象类

  第三,继承的实现原则

  =======================================================

  一.继承

  1.继承的定义

  继承是创建新类的一种方式。新创建的类称为子类,它将继承父类的属性。

  在Python中,子类(派生类3354)可以继承一个或多个父类(基类或超类)。

  2.为什么使用继承?

  继承可以有效减少代码冗余。

  3.如何使用继承

  继承代码的示例

  #继承示例

  类别父亲1:

  及格

  父类2:

  及格

  类Son1(父1): # Son1继承父1

  及格

  类儿子2(父亲1,父亲2): #儿子2同时继承父亲1父亲2。

  及格

  打印(Son1。__bases__)

  打印(Son2。__bases__)

  打印(父1。__bases__)

  打印(父2。__bases__)

  上述代码的结果如下:

  (class __main__.Father1 ,)#Son1继承Father1。

  (class _ _ main _ _。父1 ,类 _ _ main _ _。父亲2’)# son 2继承父亲1,父亲2

  (class object ,)#Python3有一个默认的父类对象。

  (class object ,)# Python 3中有一个默认的父类对象# Python 3中所有的新类默认都有一个父类(object)。

  #在python2中,默认没有父类,可以添加(object)作为父类。

  注意Python2和Python3中的类的分类是不同的:

  # Python 2中的类:

  #

  # 1.经典类

  #表示不继承默认父类对象的类,以及不继承对象类的子类。

  #

  # 2.新类

  #值是继承默认父类对象和对象类的子类的类。

  #

  #

  # Python 3中的类:

  #

  #团结是一个新的阶层。

  4.建立继承关系。

  继承是类之间的关系。我们需要找到这个关系,先抽象出来,然后建立继承。

  子类共享的特性由父类统一管理。

  班级学生:

  学校=SH高中

  def __init__(本人,姓名,年龄,性别):

  self.name=name

  年龄=年龄

  self.gender=性别

  def tell_info(自我):

  print(学校:姓名为%s,年龄为%s,性别为%s %(姓名,年龄,性别))

  Classstudent (SchoolPeople): #继承SchoolPeople。

  定义学习(自我):

  打印( %s正在学习 %name )

  def tell_info(自我):

  打印(我是学生%s,年龄%s,性别%s %(姓名,年龄,性别))

  班主任(学生):#继承学生

  定义示教(自我):

  打印( %s正在教授 %name )

  def tell_info(自我):

  打印(我是老师%s,年龄%s,性别%s %(姓名,年龄,性别))

  student1=在校学生(鲍勃, 22 ,男性)

  teacher1=学校教师( Ajax , 33 ,女性)

  打印(学生1。__字典_ _)

  打印(学生1 .学校)

  打印(教师1。__字典_ _)

  #子类定义了自己的tell_info()函数,显示格式会按照子类的格式显示,而不是按照父类的格式显示。

  student1.tell_info()

  teacher1.tell_info()

  请仔细看下面的代码:

  Foo类:

  定义F1(自身):

  打印( Foo。F1 )

  定义F2(自身):

  打印( Foo。F2’)

  自我。F1()

  Class Bar(Foo): # inherit Foo

  F1 (self):在#子类中还有一个与父类同名的方法F1。

  打印(栏。F1 )

  obj=Bar()

  obj。F2()

  # obj首先找到F2方法在父类Foo中运行。

  #当你奔向自我。F1(),你将调用子类Bar的F1()方法,而不是父类的F1()方法。

  上面显示的结果是:

  福。第二子代

  巴录书子一代

  5.子类在新方法中派生出重用父类的功能。

  派生意味着子类定义自己的新属性。如果与父类同名,则以子类自己的属性为准。

  A.调用父类方法来命名名称。请看下面的代码。

  班级学生:

  学校=老男孩

  def __init__(本人,姓名,年龄,性别):

  self.name=name

  年龄=年龄

  自我.性=性

  def tell_info(自我):

  打印(“”)

  ========个人信息=========

  名称:%s

  年龄:%s

  性别:%s

   %(自我姓名,自我年龄,自我性别))

  班主任(学生):#继承学生

  def __init__(本人,姓名,年龄,性别,级别,工资):

  # self.name=name

  # self.age=年龄

  # self.sex=性

  学生。_ _ init _ _(本人,姓名,年龄,性别)#点名指向在校学生

  自我水平=水平

  self.salary=薪水

  def tell_info(自我):

  SchoolPeople.tell_info(self) #点名指向SchoolPeople

  打印(“”)

  等级:%s

  工资:%s

   %(self.level,self.salary))

  tea1=学校老师(鲍勃,18,男性,9,50k)

  # print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)

  tea1.tell_info()

  B.调用父类方法并使用super()方法。

  注意Python2和Python3中super()的格式。

  此方法只能调用父类的方法。

  班级学生:

  学校=老男孩

  def __init__(本人,姓名,年龄,性别):

  self.name=name

  年龄=年龄

  自我.性=性

  def tell_info(自我):

  打印(“”)

  ========个人信息=========

  名称:%s

  年龄:%s

  性别:%s

   %(自我姓名,自我年龄,自我性别))

  班主任(学生):#继承学生

  def __init__(本人,姓名,年龄,性别,级别,工资):

  # self.name=name

  # self.age=年龄

  # self.sex=性

  超级()。_ _ init _ _(自身,姓名,年龄,性别)#使用super()指向父类,Python3格式

  #超级(学校人,自己)。_ _ init _ _(本人,姓名,年龄,性别)Python 2格式

  自我水平=水平

  self.salary=薪水

  def tell_info(自我):

  超级()。tell_info(self) #使用super()指向父类,Python3格式

  #超级(学校人,自己)。tell _ info (self) Python 2格式

  打印(“”)

  等级:%s

  工资:%s

   %(self.level,self.salary))

  tea1=学校老师(鲍勃,18,男性,9,50k)

  # print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)

  tea1.tell_info()

  第二,抽象类

  主abc模块用于实现标准化。父类有一些方法,子类也必须有。

  您需要将@abc.abstractclassmethod添加到父类的方法头中。

  类文件(meta @abc.abstractmethod

  DEF (self): #必须定义以下方法。否则,将不允许实例化。

  及格

  @abc.abstractmethod

  定义写入(自我):

  及格

  Sata类(文件):

  定义读取(自身):

  及格

  定义写入(自我):

  及格

  定义asb(自身):

  打印(“adsf”)

  Fil=Sata()

  Fil.asb()

  print(Sata.mro())

  第三,继承的实现原则

  1.继任顺序:

  经典:当一个类是经典类时,在多继承的情况下,当要搜索的属性不存在时,会先按深度搜索。

  新类:当类是新类时,在多重继承的情况下,当要查询的属性不存在时,会先按广度搜索。

  2.方法解析顺序,MRO)

  在多重继承中,有一个由不相关的祖先类实现同名方法引起的冲突问题,称为“钻石问题”。

  Python以特定的顺序遍历继承图,这被称为方法解析顺序。

  如图,左图是类的UML图,右图虚线箭头是方法解析顺序:

  3.使用属性查看继承顺序:

  打印(类名。mro())

  A类(对象):

  # def测试(自我):

  #打印(“从A开始”)

  及格

  B(A)类:

  # def测试(自我):

  #打印(从B开始)

  及格

  丙类(甲类):

  # def测试(自我):

  # print(来自C )

  及格

  D(B)类:

  # def测试(自我):

  #打印(从D开始)

  及格

  E(C)类:

  # def测试(自我):

  #打印(来自E )

  及格

  F类(D,E):

  # def测试(自我):

  #打印(从F开始)

  及格

  f1=F()

  打印(材料维护报告())

  4.关于处理多重继承的建议

  (1)区分接口继承和实现继承;

  继承接口:创建子类型,这是框架的支柱;继承实现:通过重用避免代码重复,通常可以切换到组合和委托模式。(2)使用抽象基类显式表达接口;

  (3)通过混合复用码;

  混合类为多个不相关的子类提供方法实现,易于重用,但不会实例化。而具体类不能只是继承混合类。

  (4)在名称中明确标明混合;

  在Python中没有正式的方法将类声明为mixed,Luciano建议在名称中添加Mixin后缀。Tkinter中的XView要改成XViewMixin。

  (5)抽象基类可以混入,反之亦然;

  抽象基类与混合的异同;

  抽象基类会定义类型,mixing不会;抽象基类可以是其他类的唯一基类,但不能混进去;抽象基类实现的具体方法只能和抽象基类及其超类中的方法合作,mixing没有这样的限制。(6)不要子类化多个具体的类;

  可能没有具体的类,或者最多有一个具体的超类。

  比如在Class Dish(中国,日本,豆腐)中,如果豆腐是一个具体的类,那么中国和日本一定是抽象的基类或者是混在一起的。

  (7)为用户提供聚合类;

  类聚合是指一个类的结构主要继承自mixing,不添加结构或行为。Tkinter采纳了这个建议。

  (8)优先考虑对象组合而不是类继承。

  优先级组合可以使设计更加灵活。

  组合委托可以代替混合,但不能代替接口继承来定义类型层次结构。

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: