day 4 继承
1.继承引入,减少代码量

1)版本1:
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog:
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----")
def bark(self):
print("-----汪汪叫---") a = Animal()
a.eat() wangcai = Dog()
wangcai.eat()
----吃----
----吃----
2)版本2:继承动物类
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----")
'''
def bark(self):
print("-----汪汪叫---") a = Animal()
a.eat() wangcai = Dog()
wangcai.eat()
3)版本3:
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Cat(Animal):
def catch(self):
print("---抓老鼠---")
a = Animal()
a.eat() wangcai = Dog()
wangcai.eat() tom = Cat()
tom.eat()

2.子类继承父类的父类
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----") xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
---飞----
-----汪汪叫---
----吃----

3.重写
先在自己的类中查找父类的同名方法,没有的话去父类查找

class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----")
def bark(self): #定义和父类方法同名的方法,就是重写
print("---重写叫---") xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
---飞----
---重写叫---
----吃----
4.调用被重写的方法
既要调用父类的方法,又要重写该方法
1)版本1: Dog.bark(self)
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----")
def bark(self):
print("---重写叫---") #第一种调用被重写的父类的方法
Dog.bark(self) xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
---飞----
---重写叫---
-----汪汪叫---
----吃----
2)版本2:super().dark()
class Animal:
'''定义一个动物类'''
def eat(self):
print("----吃----")
def drink(self):
print("----喝----")
def sleep(self):
print("----睡觉----")
def run(self):
print("----跑----") class Dog(Animal):
def bark(self):
print("-----汪汪叫---") class Xiaotq(Dog):
def fly(self):
print("---飞----")
def bark(self):
print("---重写叫---") #第一种调用被重写的父类的方法
# Dog.bark(self) #第2种
super().bark() #super()高级的,上级的 xiaotianquan = Xiaotq()
xiaotianquan.fly()
xiaotianquan.bark()
xiaotianquan.eat()
5.私有属性私有方法,不能被直接继承
私有属性私有方法可以被公有方法调用,公有方法可以被继承
1)版本1:
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") class B(A):
pass b = B()
b.test1()
b.__test2() #私有方法不会被继承 print(b.num1)
print(b.__num2) #私有属性不会被继承
---test1---
Traceback (most recent call last):
File "09-私有在继承中的表现.py", line 17, in <module>
b.__test2() #私有方法不会被继承
AttributeError: 'B' object has no attribute '__test2'
2)版本2:
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") class B(A):
pass b = B()
b.test1()
#b.__test2() #私有方法不会被继承 print(b.num1)
#print(b.__num2) #私有属性不会被继承
---test1---
100
3)版本3:通过公有方法调用
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") def test3(self):
self.__test2()
print(self.__num2) class B(A):
pass b = B()
b.test1()
#b.__test2() #私有方法不会被继承 print(b.num1)
#print(b.__num2) #私有属性不会被继承 b.test3() #公有方法调用私有属性方法
---test1---
100
--test2---
222
4)版本4:
class A:
def __init__(self):
self.num1 = 100
self.__num2 = 222 def test1(self):
print("---test1---") def __test2(self):
print("--test2---") def test3(self):
self.__test2()
print(self.__num2) class B(A):
def test4(self):
self.__test2()
print(self.__num2) b = B()
b.test1()
#b.__test2() #私有方法不会被继承 print(b.num1)
#print(b.__num2) #私有属性不会被继承 b.test3()
b.test4()
---test1---
100
--test2---
222
Traceback (most recent call last):
File "09-私有在继承中的表现.py", line 29, in <module>
b.test4()
File "09-私有在继承中的表现.py", line 18, in test4
self.__test2()
AttributeError: 'B' object has no attribute '_B__test2'
6.多继承
经典类
class Dog:
pass
新式类 object是所有类的父类
class Dog(object):
pass
多继承
class Base(object):
def base(self):
print("----this is base-") class A(Base):
def test1(self):
print("---this is A---") class B(Base):
def test2(self):
print("----this is B---") class C(A,B):
pass c1 = C()
c1.test1()
c1.test2()
c1.base()
---this is A---
----this is B---
----this is base-

7.多继承注意点
切记:不要出现相同的方法名
1)版本1:先调用自身的
class Base(object):
def test(self):
print("----this is base-") class A(Base):
def test(self):
print("---this is A---") class B(Base):
def test(self):
print("----this is B---") class C(A,B):
def test(self):
print("----this is C---") c1 = C()
c1.test()
----this is C---
2)版本2:调用哪个父类的AorB??
class Base(object):
def test(self):
print("----this is base-") class A(Base):
def test(self):
print("---this is A---") class B(Base):
def test(self):
print("----this is B---") class C(A,B):
pass
# def test(self):
# print("----this is C---") c1 = C()
c1.test()
---this is A---
3)版本3:调用顺序
class Base(object):
def test(self):
print("----this is base-") class A(Base):
def test(self):
print("---this is A---") class B(Base):
def test(self):
print("----this is B---") class C(A,B):
pass
# def test(self):
# print("----this is C---") c1 = C()
c1.test()
print(C.__mro__)

day 4 继承的更多相关文章
- javaScript的原型继承与多态性
1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
- JavaScript的继承实现方式
1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...
- javascript中的继承与深度拷贝
前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...
- 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- JS继承类相关试题
题目一: //有关于原型继承的代码如下:function Person(name) { this.name = name;}Person.prototype = { getName : f ...
- JS继承之寄生类继承
原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...
- JS继承之借用构造函数继承和组合继承
根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...
- JS继承之原型继承
许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...
- 深入浅出JavaScript之原型链&继承
Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...
- 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型
前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.
随机推荐
- Template-Driven Forms 模板驱动式表单
Angular 4.x 中有两种表单: Template-Driven Forms - 模板驱动式表单 (类似于 AngularJS 1.x 中的表单 ) Reactive Forms - 响应式表单 ...
- the longest distance of a binary tree
版权声明:欢迎查看本博客.希望对你有有所帮助 https://blog.csdn.net/cqs_2012/article/details/24880735 the longest distance ...
- μCOS-II系统之事件(event)的使用规则及Semaphore的相互排斥量使用方法
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wavemcu/article/details/27798493 ****************** ...
- mysql 聚集和非聚集索引 解析
一.聚集索引(聚簇索引) 1. 什么是聚集索引? 比如要查找'hello',则直接找内容为hello的行,我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”. 聚集索引的叶子节点 ...
- UVA 12230 Crossing Rivers
嘟嘟嘟 虽然分类是期望dp,不过好像是最水的 因为在陆地上的时间和概率是固定的,所以只用考虑过河的期望时间. 对于一条河p, l, v,p好像没什么用……不管了,首先期望时间我觉得可以这么算:期望时间 ...
- php反序列化
之前听漏洞银行的一个女生讲php反序列化.她说了一句.php反序列话找public变量. 导致我以为必须php反序列化.可控的变量必须是public or protected.private私有的变量 ...
- laravel 多态映射(打赏为例)
迁移: public function up() { Schema::create('rewards', function (Blueprint $table) { $table->increm ...
- 【转】CopyOnWriteArrayList
初识CopyOnWriteArrayList 第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayLis ...
- Autoware 安装流程
1. 前言 最近一个项目采用Autoware的无人驾驶系统,在安装工控机的过程中,踩了不少坑,留下记录,造福后人. 相关的下载在我的百度网盘,大家自行下载.链接: https://pan.baidu. ...
- HDU 1208 Pascal's Travels 经典 跳格子的方案数 (dp或者记忆化搜索)
Pascal's Travels Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
