python 之 面向对象基础(继承与派生,经典类与新式类)
7.2 继承与派生
7.21继承
1、什么是继承? 继承是一种新建类的的方式,在python中支持一个子类继承多个父类。新建的类称为子类或者派生类,父类又可以称为基类或者超类,子类会”遗传“父类的属性。
2、为什么要用继承 减少代码冗余
class ParentClass1:
pass
class ParentClass2:
pass
class Subclass1(ParentClass1):
pass
class Subclass2(ParentClass1,ParentClass2):
pass
print(Subclass1.__bases__) #(<class '__main__.ParentClass1'>,)
print(Subclass2.__bases__) #(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
3、继承是类与类之间的关系,寻找这种关系需要先抽象再继承
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class OldboyTeacher(OldboyPeople): #继承OldboyPeople类
def change_score(self):
print('teacher %s is changing score' %self.name)
class Oldboystudent(OldboyPeople): #继承OldboyPeople类
def choose(self):
print('student %s choose course' %self.name)
tea1 = OldboyTeacher('egon', 18, 'male') # 相当于OldboyTeacher.__init__(...)
stu1=Oldboystudent('alex',73,'female')
print(tea1.name,tea1.age,tea1.sex) #egon 18 male
print(stu1.name,stu1.age,stu1.sex) #alex 73 female
7.22 派生
派生:子类定义自己新的属性,如果与父类同名,以子类自己的为准
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def f1(self):
print('爹的f1')
class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level,salary):
self.name=name
self.age=age
self.sex=sex
self.level=level
self.salary=salary
def change_score(self):
print('teacher %s is changing score' %self.name)
def f1(self):
print('儿子的f1')
tea1 = OldboyTeacher('egon', 18, 'male',9,3.1) #传入6个参数,如果传入父类ze报错
print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary) #egon 18 male 9 3.1
7.23 在子类派生出的新方法中重用父类的功能
方式一:指名道姓地调用(与继承没有什么关系)
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex class OldboyTeacher(OldboyPeople): #可有可无
def __init__(self, name, age, sex, level, salary):
# self.name = name
# self.age = age
# self.sex = sex
OldboyPeople.__init__(self,name, age, sex)#用 OldboyPeople调用__init__的方式重用父类功能
self.level = level
self.salary = salary
tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #egon 18 male 9 3.1
方式二:super()调用(严格依赖于继承)
super ( ) 的返回值是一个特殊的对象,该对象专门用来调用父类中的属性,super()会严格按照mro列表从当前查找到的位置继续往后查找
了解:在python2中,需要super(自己的类名,self)
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class OldboyTeacher(OldboyPeople): #必须有父类
def __init__(self, name, age, sex, level, salary):
super(OldboyTeacher,self).__init__(name,age,sex)# OldboyPeople.__init__(self,name, age,sex)
self.level = level
self.salary = salary
tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #egon 18 male 9 3.1
7.3 经典类与新式类
1、新式类: 继承object的类,以及该类的子类,都是新式类
在python3中,如果一个类没有指定继承的父类,默认就继承object,所以说python3中所有的类都是新式类
2、经典类(只有在python2才区分经典类与新式类):没有继承object的类,以及该类的子类,都是经典类
class Foo(): #在python3中
pass
class Bar(Foo):
pass
print(Foo.__bases__) #(<class 'object'>,)
print(Bar.__bases__) #(<class '__main__.Foo'>,)
7.34 在多继承背景下的属性查找
属性查找
obj.x
1、先从obj.__dict__
2、对象的类.__dict__
3、父类.__dict__
..........
如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性
如果继承关系为菱形结构,那么属性的查找方式有两种,分别是:深度优先和广度优先
print(F.__mro__) # F.mro() #只有新式类才有这个属性可以查看线性列表,查看属性查找顺序,经典类没有这个属性
python 之 面向对象基础(继承与派生,经典类与新式类)的更多相关文章
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- python 面向对象之继承与派生
一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...
- python基础——继承与派生、组合
python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...
- python之旅:面向对象之继承与派生
一 初识继承 编写类时,并非总要从空白开始.如果你要编写的类正好是另一个现成类的特殊版本,可使用继承来减少代码冗余,子类会“遗传”父类的属性,从而解决代码重用问题 什么是继承 继承是一种创建新类的方式 ...
- python开发面向对象基础:组合&继承
一,组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 人类装备了武器类就是组合 1.圆环,将圆类实例后传给圆环类 #!/usr/bin/env python #_*_ ...
- python面向对象之继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...
- python之面向对象(继承)
类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...
- 二十三. Python基础(23)--经典类和新式类
二十三. Python基础(23)--经典类和新式类 ●知识框架 ●接口类&抽象类的实现 # 接口类&抽象类的实现 #①抛出异常法 class Parent(object): ...
- 【python】-- 类的多继承、经典类、新式类
继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...
随机推荐
- 并发用户 VS TPS
TPS模式(吞吐量模式)是一种更好的方式衡量服务端系统的能力. 基本概念: 并发用户数:简称VU ,指的是现实系统中操作业务的用户,在性能测试工具中,一般称为虚拟用户数(Virutal User),注 ...
- hdoj 1010-Tempter of the Bone
Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...
- windows下更改Apache以fastcgi方式运行php
Apache 默认 apache2handler 方式运行处理php. 下面说切换方法: 1.下载fastcgi模块,打开https://www.apachelounge.com/download/选 ...
- 【自己给自己题目做】:如何用裸的 Canvas 实现魔方效果
最终demo -> 3d魔方 体验方法: 浮动鼠标找到合适的位置,按空格键暂停 选择要翻转的3*3模块,找到相邻两个正方体,鼠标点击第一个正方体,并且一直保持鼠标按下的状态直到移到第二个正方体后 ...
- [Eclipse]已经写好的代码怎样切换为unix下的换行符?
问题:使用eclise提交文件到github,每行文件后面都有^M字符 切换换行符的显示格式, 但是这样只能对新文件起作用,修改旧文件:
- ISO/IEC 9899:2011 条款6.5.1——基本表达式
6.5.1 基本表达式 语法 1.primary-expression: identifier constant string-literal ( expression ) generic ...
- vue plupload 的使用
1. 首选npm安装plupload 2. 阿里云OSS PHP 安全上传 <template> <div class="imgUpload"> aaa ...
- nginx奔溃自动重启Shell脚本
# vi /usr/local/nginx/sbin/nginx_restart.sh 贴入一下代码: #!/bin/bash #www.xmsolink.com #Monitor nginx ser ...
- RestSharp - Ignore SSL errors
项目启动时,添加下面代码: 项目启动时,添加 public App() { ServicePointManager.ServerCertificateValidationCallback += (se ...
- C++的override和final
1.final用于让虚函数不可被重写 struct B2 { virtual void f() final {} // final 函数 }; struct D2 : B2 { virtual voi ...