一、组合

1、定义:自定义类的对象作为类的属性

A类的对象具备某一个属性,该属性的值是B类的对象
基于这种方式就把A类与B类组合到一起
对象既能使用A类中的数据与功能,也能使用B类中的数据与功能

2、作用:组合与继承的作用一样,都是用来减少类与类之间的重复代码

class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age t1 = Teacher('Owen', 17)
print(t1.name, t1.age) # Owen 17
print(type(t1.name), type(t1.age)) # <class 'str'> <class 'int'> class Student:
# 学生可以有老师属性
def __init__(self, name, age, teacher):
self.name = name
self.age = age # 自定义类的对象作为类的属性
self.teacher = teacher stu = Student('Bob',18,t1 )
# print(stu.__dict__)
# {'name': 'Bob', 'age': 18, 'teacher': <__main__.Teacher object at 0x00000000021F7E10>} # 学生的年龄和姓名
print(stu.name, stu.age) # Bob 18
# 学生的老师年龄和姓名
print(stu.teacher.name, stu.teacher.age) # Owen 17

二、继承

1、定义:一种关系,子类可以通过父类获取属性和方法

继承是一种新建类的方式,新建的类称为子类或派生类

父类又称为基类、超类

作用:子类可以“遗传”父类的属性,从而可以减少代码冗余

如何寻找继承关系:先抽象,再继承,继承描述的就是 一种父子关系/从属关系

2、继承语法:

class Foo1:
pass class Bar(Foo1):
pass class Bar: # 在python3中没有继承任何类的类,默认继承object
pass
例:

class People:
def __init__(self, name):
self.name = name def eat(self):
print(self.name + '在吃饭') class Student(People):
identify = '学生'
# def __init__(self, name):
# self.name = name # def eat(self):
# print(self.name + '在吃饭') student = Student('Bob')
student.eat() # Bob在吃饭 class Leader(People):
# def __init__(self, name):
# self.name = name
#
# def eat(self):
# print(self.name + '在吃饭')
pass leader = Leader('Yang')
leader.eat() # Yang在吃饭

3、继承关系(继承规则):继承是类与类之间的关系,寻找这种关系需要先抽象再继承

①父类的所有未封装的属性和方法,子类都能访问

②父类的所有封装的属性和方法,子类都不能访问

在外界通过子类或子类对象,不能访问

在子类内部也不能访问

class OldboyPeople:
school = 'oldboy' def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex class OldboyTeacher(OldboyPeople):
def change_score(self):
print('teacher %s is changing score' % self.name) class Oldboystudent(OldboyPeople):
def choose(self):
print('student %s choose course' % self.name) tea1 = OldboyTeacher('egon', 18, 'male')
stu1 = Oldboystudent('alex', 73, 'female') print(tea1.name, tea1.age, tea1.sex) # egon 18 male

4、继承关系下的属性查找顺序:

①优先找自身,自身没有找父类

②父类没有找父类的父类

③一直找到最顶级的父类,如果还没有报错

5、抽离和派生

抽离:先有多个共有的类,抽出共性形成父类

派生:子类定义的名字会覆盖父类的同名属性

三、方法重写和重用

1、重写:先写好父类的方法,由于父类方法的功能不满足子类需求

子类可以重写父类方法:方法名与父类相同,自定义方法的实现体

2、重用:还需要父类方法的功能,在父类方法功能基础上再添加新功能

突破点:在子类中去调用父类的方法,还有保证调用者是子类(子类的对象)

# 1、方法的重写
class Sup:
num = 10
def test(self):
print('test sup') class Sub(Sup):
num = 100
# 先写好父类的方法,由于父类方法的功能不满足子类需求,
# 子类可以重写父类方法:方法名与父类相同,自定义方法的实现体
def test(self):
print('test sub') print(Sub.num) #
Sub().test() # test sub # 2、方法的重用
class Sup:
def test(self):
print('test sup') class Sub(Sup):
pass
# 重用:还需要父类方法的功能,在父类方法功能基础上再添加新功能
# 突破点:在子类中去调用父类的方法,还有保证调用者是子类(子类的对象)
def test(self):
# python2中写法:super(Sub, self).test()
# python3中简化写法
super().test()
print('test sub') Sub().test() # test sub

四、init结合super()

super关键字

super()可以得到调用父级功能的对象,调用者还是子类对象

super()只能在子类的方法中使用

uper()本质super(子类类名,当前对象)

# 人类:只需要初始化 - name
# 老师: 要初始化 - name salary
# 学生: 要初始化 - name grade class Sup:
def test(self):
print(self) def __init__(self, name):
self.name = name class Sub(Sup):
# 有继承关系下,只要名字相同,即使产生不同,还是属于同一个方法
def test(self, num):
super().test()
print(num) # 默认父级的__init__可以被继承过来,
# 但是会出现子类对象的属性比父类多 def __init__(self, name, salary):
super().__init__(name) # 父级有的共性功能通过super()交给父级做
self.salary = salary # 子类特有的自己来完成 # Sub().test(10)
# Sub().test() # 使用还是使用自身带参的,不能使用父级不带参的
# (本质名字相同就是一个,优先查找自己的)

五、多继承

1、简单的多继承

属性的查找顺序:优先找自己的,如果没有,按照继承先后查找父级

class A:
name = 'A'
num = 10 class B:
name = 'B'
count = 100 # 子类可以继承所有父类的所有可继承属性
class C(A, B): # 自己 => A => B pass print(C.num) #
print(C.count) #
print(C.name) # A
# 打印属性查找的顺序
print(C.mro())
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]

2、复杂的多继承

class A:
name = "A"
class B(A):
name = "B"
class C:
name = "C"
class D(C):
name = "D"
class E(B, D):
name = "E"
print(E.mro())
# [<class '__main__.E'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.D'>, <class '__main__.C'>, <class 'object'>]

3、新式类与经典类

①新式类:继承object的类及其子类都是新式类

在python3中如果一类没有继承任何父类,那么默认继承object类,即在python3中所有的类都是新式类

②经典类:(只在python2中才有)没有继承object的类及其子类都是经典类

③二者的区分:在菱形继承下

经典类:深度优先查找

新式类:广度优先查找

class Foo(object):
pass class Bar(Foo):
pass print(Foo.__bases__) # (<class 'object'>,)
print(Bar.__bases__) # (<class '__main__.Foo'>,)

day 24 二十四、组合、继承、方法重写和重用、super()的更多相关文章

  1. python学习笔记(二十四)继承与封装

    继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承. 实现继承的类称为子类,也叫派生类, ...

  2. Python笔记(二十四)_魔法方法_运算符的魔法方法

    算数运算方法 .反运算方法 以对象A+对象B为例,都是将A作为self值,而B作为other值传入__add__(self,other)方法: 当用户输入A+B,就会调用重写的add方法: >& ...

  3. Struts(二十四):短路验证&重写实现转换验证失败时短路&非字段验证

    短路验证: 若对一个字段使用多个验证器,默认情况下会执行所有的验证.若希望前面的验证器没有通过,后面的验证器就不再执行,可以使用短路验证. 1.如下拦截器,如果输入字符串,提交表单后,默认是会出现三个 ...

  4. 二十四. Python基础(24)--封装

    二十四. Python基础(24)--封装 ● 知识结构   ● 类属性和__slots__属性 class Student(object):     grade = 3 # 也可以写在__slots ...

  5. 使用Typescript重构axios(二十四)——防御XSRF攻击

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. 设计模式学习(二十四):Spring 中使用到的设计模式

    设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...

  7. WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?

    原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...

  8. 3360: [Usaco2004 Jan]算二十四

    3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 6[Submit][Statu ...

  9. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

随机推荐

  1. TPS和QPS 并发量区别;日活 访问量 活跃度

    一.系统承载吞度量 系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高,外部系统接口.IO影响速度越慢,系统吞吐能力越低,反之越高 ...

  2. IDEA15 下运行Scala遇到问题以及解决办法

    为了让Scala运行起来还是很麻烦,为了大家方便,还是记录下来: 1.首先我下载的是IDEA的社区版本,版本号为15. 2.下载安装scala插件: 2.1 进入设置菜单. 2.2 点击安装JetBr ...

  3. Java 多线程总结

    昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...

  4. 关于MySQL中的8个 character_set 变量

    https://blog.csdn.net/sun8112133/article/details/79921734 本篇会简单介绍在 MySQL 中关于 8个 character_set 变量的基本作 ...

  5. Python3.6及以上pip安装pymssql错误的解决办法[Windows&Linux freetds安装]

    只有由于Python3.6装不上 pymssql,所以一直用Python3.5的版本. 报错界面 现在有了新的解决方法: 原帖如下: https://docs.microsoft.com/en-us/ ...

  6. 帆软报表(finereport)安装/配置

    1.首先是安装帆软报表软件 下载地址:http://www.finereport.com/product/download           激活码注册格账号就有了 2.启动软件,新建连接数据库 点 ...

  7. 【原创】大叔问题定位分享(18)beeline连接spark thrift有时会卡住

    spark 2.1.1 beeline连接spark thrift之后,执行use database有时会卡住,而use database 在server端对应的是 setCurrentDatabas ...

  8. js 中arguments,call,apply,bind的使用

    //对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 //arguments是什么? //答:1:arguments是收到的实参副本 //2 ...

  9. ESP8266代码中的存储标记

    const uint8 MyArr[1024] ICACHE_RODATA_ATTR = {0}; void MyFun() ICACHE_FLASH_ATTR { } 这种 ICACHE 开头的宏作 ...

  10. djjango安装及其 操作命令

    一 首先掌握HTTP协议 HTTP四大特性: 1 基于tcp/IP作用在应用层之上的协议 2 基于请求响应 3 无状态(不识别来的用户的状态) 4 无连接(请求完返回响应后就断开) 数据格式: 请求 ...