类的继承

  • 继承是为了拿到父类的所有东西

继承的特性

  • 减少代码的冗余
  • Python中父类和子类的对应关系是多对多
  • 使用__bases__方法获取对象继承的类
# 父类(超类,基类)
class FatherFoo:
def __init__(self, first_name, money, car, house):
self.first_name = first_name
self.money = money
self.car = car
self.house = house def lixiang(self):
print('理想') # 子类(派生类)
class SonFoo(FatherFoo):
pass sf = SonFoo('叶', 3000, 'feng', '9')
print(sf.first_name)
print(sf.money)
print(sf.car)
print(sf.house)
sf.lixiang()
print(SonFoo.__bases__)

3000
feng
9
理想
(<class '__main__.FatherFoo'>,)

不推荐继承多个,因为继承多个的时候,代码太混乱,最好是只继承一个父类

  • 继承后查找顺序;从自身向上查找,对象-->类-->父类
class Foo:
def f1(self):
print('from Foo.f1') def f2(self):
print('from Foo.f2')
self.f1() # self是obj本身,也就是b,b中没有f1,所以去到Bar找 class Bar(Foo):
def f1(self):
print('Bar Foo.f1') b = Bar()
print(b.__dict__)
b.f2()
{}
Foo.f2
Bar.f1

类的派生

继承中当子类也有也有自己的init时,就会发生下面的情况

class Animal:
def __init__(self, height, weight):
self.height = height
self.weight = weight def sleep(self):
print('睡觉了') class Dog(Animal):
def __init__(self, name, age):
self.name = name
self.age = age d1 = Dog('shinubi', 3) # 只能传入name和age
print(d1.__dict__)
# print(d1.height) # 会报错
# print(d1.weight)
print(d1.name)
print(d1.age)
{'name': 'shinubi', 'age': 3}
shinubi
3

这样的话就失去了继承的意义,因为继承就是要获取父类的所有属性,但这样就无法获取init里面的属性

解决方案一:

class Cat(Animal):
def __init__(self, name, age):
self.name = name
self.age = age c1 = Cat('Tom', 2)
Animal.__init__(c1, 50, 10) # 把实例对象c1当成参数传入Animal的init函数中
print(c1.__dict__)
{'name': 'Tom', 'age': 2, 'height': 50, 'weight': 10}

但是这种方法和继承无关,即便Cat类不继承Animal也一样可以做到

解决方案二:

  • 派生:继承父类属性的同时增加新的属性,然后使用super()._init_()
  • 继承才可以使用,相当于是对方案一的一层封装
class Animal:
def __init__(self, height, weight):
self.height = height
self.weight = weight def eat(self):
print('吃') class Felidae:
def __init__(self, gender):
self.gender = gender def sleep(self):
print('睡') class Dog(Animal, Felidae):
def __init__(self, name, age, height, weight):
# Python3可以不用填super()中的参数,默认是填了他自己
super().__init__(weight, height)
# super(Dog, self).__init__(weight, height)
self.name = name
self.age = age d1 = Dog('shinubi', 3, 100, 80)
print(d1.__dict__)
{'height': 80, 'weight': 100, 'name': 'shinubi', 'age': 3}

这里默认是会继承第一个父类的属性,如果要继承第二个或是两个都继承,可以把代码从两个父类一个子类,调整成父类-->父类-->子类的形式。

或者用如下方法:

# 继承Felidae
class Cat(Animal, Felidae):
def __init__(self, name, age, gender):
# 添加第一个父类,就能找到第二个,我也不知道为什么,试出来的,现在没时间查
super(Animal, self).__init__(gender)
self.name = name
self.age = age c1 = Cat('Tom', 2, 'male')
print(c1.__dict__)
print('-' * 20) # 两个都继承
class Cat(Animal, Felidae):
def __init__(self, name, age, height, weight, gender):
# 两个一起写就可以了,有没有别的办法我也不清楚,这也是试出来的
super(Cat, self).__init__(height, weight)
super(Animal, self).__init__(gender)
self.name = name
self.age = age c1 = Cat('Tom', 2, 'male')
print(c1.__dict__)
{'gender': 'male', 'name': 'Tom', 'age': 2}
--------------------
{'height': 50, 'weight': 10, 'gender': 'male', 'name': 'Tom', 'age': 2}

类的组合

  • 将类组合在一起,解决类与类之间的代码冗余度

  • 写一个简单的选课系统

class People:
def __init__(self, name, gender):
self.name = name
self.gender = gender def eat(self):
print(f'{self.name}开始吃了') class Student(People):
def __init__(self, num, name, gender):
super(Student, self).__init__(name, gender) def choose_course(self, course):
self.course = course
print(f'{self.name}选课{course.name}成功') class Teacher(People):
def __init__(self, level, name, gender):
super(Teacher, self).__init__(name, gender)
self.level = level def scored(self, student, course, score):
print(f'老师{self.name}给{student.name}课程{course.name}打分{score}') class Course:
def __init__(self, name, price):
self.name = name
self.price = price class Admin(People):
def create_course(self, name, price):
course = Course(name, price)
print(f'管理员{self.name}创建了课程{name}')
return course # 对象创建
# 创建学生对象
zhangsan = Student(1, 'zhangsan', 'male')
lisi = Student(2, 'lisi', 'male') # 创建老师对象
nick = Teacher(1, 'nick', 'male')
tank = Teacher(2, 'tank', 'male') # 创建管理员
baba = Admin('baba', 'male') # 业务逻辑
# 1. 创建课程
python = baba.create_course('Python', 8888)
linux = baba.create_course('Linux', 6666)
print(python.__dict__)
print(linux.__dict__)
print('-' * 20) # 2. 学生选择课程
zhangsan.choose_course(python)
lisi.choose_course(linux)
print('-' * 20) # 3. 老师给学生打分
nick.scored(zhangsan, python, '10')
tank.scored(lisi, linux, '30')
print('-' * 20)
管理员baba创建了课程Python
管理员baba创建了课程Linux
{'name': 'Python', 'price': 8888}
{'name': 'Linux', 'price': 6666}
--------------------
zhangsan选课Python成功
lisi选课Linux成功
--------------------
老师nick给zhangsan课程Python打分10
老师tank给lisi课程Linux打分30
--------------------

day35-1 类的三大特性---继承,以及类的派生的更多相关文章

  1. API的使用(3)Arrays 类,Math类,三大特性--继承

    Arrays类 概述   java.util.Arrays此时主要是用来操作数组,里面提供了很多的操作API的方法.如[排序]和[搜索]功能.其所有的方法均为静态方法,调用起来非常简单. 操作数组的方 ...

  2. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

  3. 第9章 Java类的三大特性之一:继承

    1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...

  4. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  5. 转 OC温故:类的三大特性(封装,继承,多态)

    原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...

  6. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  7. [.net 面向对象编程基础] (12) 面向对象三大特性——继承

    [.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...

  8. Python 类的三大特性的综合运用 案例

    # --------------------- 类的三大特性的综合运用 案例 ------------------------- # 定义三个类:小狗,小猫,人 # 小狗:姓名,年龄(默认1岁) 吃饭 ...

  9. day36 类的三大特性---封装以及Property特性

    目录 类的封装 如果真的要拿 类的property特性 setter & deleter 类属性用法 类与对象的绑定方法和非绑定方法 对象方法&类方法&静态方法 隐藏模块内的函 ...

随机推荐

  1. CODEVS1079 回家 (最短路)

    真是语死早,题目看了两遍才看懂. 按照题目要求建边,从'Z'开始跑最短路即可. Program CODEVS1079; ..,..] of longint; d:..] of longint; pd: ...

  2. HDU2899 Strange fuction 【二分】

    Strange fuction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. 鸟哥的Linux私房菜-----8、文件系统的装载

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  4. ExtJs--06--Ext.WindowGroup相关方法简单使用

    Ext.onReady(function(){ //用windowGroup对象去操作多个window窗体 var winG = new Ext.WindowGroup(); for (var i = ...

  5. 【Ubuntu QQ】记如何在Ubuntu上安装QQ(附下载)

    什么困扰着一批批的ubuntu桌面用户?是麻花藤.哦不,是QQ,怎么在ubuntu上安装完美无瑕的QQ. 最佳解决方案在“三”部分,当然前两个也不失为解决方案 一.尝试的开始 配置: 双系统:Wind ...

  6. luogu3382【模板】三分法

    给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 看代码即可. #include <cstdio> #include < ...

  7. bin/sh^M:损坏的解释器: 没有那个文件或目录

    脚本文件保存时使用了DOS格式,用DOS2UNIX转为UNIX格式,也可以用vim打开,用:set ff=unix转换.不要在 Windows下编辑脚本文件,否则经常会遇到这种问题. 代码:sed - ...

  8. linux下获取按键响应事件【转】

    本文转载自:https://my.oschina.net/u/157503/blog/91548 1.问题 通过一个死循环将读取键盘对应的设备文件将触发键盘事件在屏幕上打印出来,按esc退出程序 代码 ...

  9. JavaI/O 系统

    1.JavaI/O 系统概述 A.  输入输出(I/O):指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口 B. 流的概念(流:Stream) 流的基本特性:有数据.有方向 2. 流的 ...

  10. JavaWEB开发入门

    1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: •静态web资源(如html 页面 ...