Day7 类的继承和继承实现的原理
继承可以分为但继承,多继承。
- 继承的基本形式
- class ParentClass1(object): #定义父类
- pass
- class ParentClass2: #定义父类
- pass
- class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
- pass
- class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
- pass
- print(SubClass1.__bases__) #显示他继承了几类
- print(SubClass2.__bases__)
- print(ParentClass1.__bases__)
经典类和新式类:
两者区别在python3中是没有区别的,都有有个继承,如果没定义继承,也会默认将object继承,都叫新式类。
两者的区别在python2才有区别,没有定义就是经典类,如果定义了继承就是新式类。
- class Animal:
- x=1
- def __init__(self,name,age,sex):
- self.name=name
- self.age=age
- self.sex=sex
- # print('Animal.__init__')
- def eat(self):
- print('%s eat' %self.name)
- def talk(self):
- print('%s say' %self.name)
- class People(Animal):
- x=10
- def __init__(self,name,age,sex,education):
- Animal.__init__(self,name,age,sex)
- self.education=education
- # print('People.__init__')
- def talk(self):
- Animal.talk(self)
- print('这是人在说话')
- class Dog(Animal):
- pass
- class Pig(Animal):
- pass
- peo1=People('alex',18,'male','小学肄业')
- print(peo1.__dict__)
- peo1.talk()
- print(peo1.x)
- dog1=Dog('yuanhao',28,'male')
- pig1=Pig('wupeiqi',18,'male')
- print(peo1.name)
- print(dog1.name)
- print(pig1.name)
类的继承:
- class OldboyPeople:
- school = 'oldboy'
- def __init__(self,name,age,sex):
- self.name=name
- self.age=age
- self.sex=sex
- def eat(self):
- print('is eating')
- class OldboyStudent(OldboyPeople):
- def learn(self):
- print('%s is learning' %self.name)
- class OldboyTeacher(OldboyPeople):
- def __init__(self,name,age,sex,salary,title):
- OldboyPeople.__init__(self,name,age,sex)
- self.salary=salary
- self.title=title
- def teach(self):
- print('%s is teaching' %self.name)
- yl_obj=OldboyStudent('yanglei',28,'female')
- egon_obj=OldboyTeacher('egon',18,'male',3.1,'沙河霸道金牌讲师')
总结;
1,继承功能之一:解决类与类之间代码重复
2,继承是类与类之间的关系,是一种,什么是什么的关系
3,在子类派生出新的属性,以自己的为准。
4,在子类派生出新的方法内重用弗雷的功能的方式:指名道姓
eg:OldboyPeople.__init__
这种调用方法本身跟继承没有关系
继承实现的原理:
调用顺序:
单继承的话:如果执行的话先找自己的范围内,当没有的时候再去找父类。(就是不管怎么找,都是先从自身找齐)
- #单继承
- class A:
- def f1(self):
- print('A.f1')
- def f2(self):
- print('A.f2')
- self.f1() #b.f1()
- class B(A):
- def f1(self):
- print('B.f2')
- b=B()
- # b.f2=111111
- b.f2()
多继承的话:
- #多继承
- class J:
- def test(self):
- print('J')
- class A(J):
- # def test(self):
- # print('A')
- pass
- class E(J):
- def test(self):
- print('E')
- pass
- class H(J):
- def test(self):
- print('H')
- class G(H):
- def test(self):
- print('G')
- pass
- class B(A):
- # def test(self):
- # print('B')
- pass
- class D(E):
- def test(self):
- print('D')
- pass
- class F(G):
- def test(self):
- print('F')
- pass
- class C(B,D,F):
- # def test(self):
- # print('C')
- pass
- c=C()
- # c.test=1111
- c.test()
#可以利用*.mro()来查看他的调用顺序
eg: print(c.mro())
Day7 类的继承和继承实现的原理的更多相关文章
- scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- ECMAScript6 中 类的封装与继承
ECMASCRIPT6中实现了class关键字,这样使我们更容易也更形象的进行类的操作 <script type="text/javascript"> class OF ...
- iOS 杂笔-24(常用类到NSObject的继承列表)
iOS 杂笔-24(常用类到NSObject的继承列表) NSString NSObject->NSString NSArray NSObject->NSArray ↑OC基本类都直接继承 ...
- scala入门教程:scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- java类为什么是单继承。类的继承,实现接口。
java中提供类与类之间提供单继承. 提供多继承会可能出现错误,如:一个类继承了两个父类,而两个父类里面都有show()方法. class Fulei1{ public void show(){ Sy ...
- JAVA类与对象(七)------继承
理解:继承可以理解为一个对象获取属性的过程.如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类C是从类A继承而来. 在java中,类的继承是单一继承,也就是说,一个子类只能拥有一 ...
- java中关于类的封装与继承,this、super关键字的使用
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5454849.html. this关键字: this代表当前对象,它有以下几种用途: 1.本类 ...
- 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法
实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...
- 类和对象:继承 - 零基础入门学习Python038
类和对象:继承 让编程改变世界 Change the world by program 上节课的课后作业不知道大家完成的怎样?我们试图模拟一个场景,里边有一只乌龟和十条鱼,乌龟通过吃鱼来补充体力,当乌 ...
随机推荐
- python脚本程序,传入参数*要用单引号'*'
*号作为python脚本的传入参数时,必须用单引号'',才能正确传入.如python test.py 2014 '*' age python test.py 2014 * age是错误的. 比如 te ...
- matlab中 mcc/mbuild/mex 区别
mcc 的作用是将 .m文件编译为 c/c++动态链接库文件,使你可以在 c/c++程序中使用 matlab的一些函数功能.mcc 也可以将.m文件编译为exe可执行文件. mex 的作用是将 c/c ...
- Spark SQL官方文档阅读--待完善
1,DataFrame是一个将数据格式化为列形式的分布式容器,类似于一个关系型数据库表. 编程入口:SQLContext 2,SQLContext由SparkContext对象创建 也可创建一个功能更 ...
- Android必知必会-Handler可能引起的内存泄露
在Android开发中,编写多线程通常会使用到Thread和Handler,细心的朋友会发现,很常见的写法会被编辑器提示有问题,new Handler(){} 内的代码背景颜色会变成黄色.Androi ...
- CSS中编写省略号代码片段
#component-content #dtMain .dt-ul > li .component-item .component-name{ display:inline-block; ...
- Linux System Programming --Chapter Seven
文件和目录管理 一.文件与其元数据 我们首先看一下一个简单的文本文件是怎么保存的: 打开vim,编辑一段文本: [root@localhost ~]# vim hello.txt 编辑内容如下: op ...
- mysql_建立索引的优缺点
http://blog.csdn.net/superit401/article/details/51291603 建立索引的优缺点: 为什么要创建索引呢? 这是因为,创建索引可以大大提高系统的性能. ...
- Android Studio使用Lint进行代码检查
Android Studio目前已经更新到1.4版本,它作为Google官方推荐的IDE,功能非常强大,其中提供了一套静态代码分析工具,它可以帮助我们检查项目中存在的问题,让我们更有规范性的开发App ...
- iOS中NSBundle的介绍
bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle,cocoa提供了类NSBund ...
- C/C++内存布局及对齐
1.源文件转换为可执行文件 源文件经过以下几步生成可执行文件: 1.预处理(preprocessor):对#include.#define.#ifdef/#endif.#ifndef/#endif等进 ...