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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。