一、组合

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. linux内存 free命令 buffer cache作用

    free命令用于查看linux内存使用情况 #free shared:用于进程之间相互共享数据. Used:已使用内存. total:内存总量. free:未使用的内存. available:开启一个 ...

  2. 《我是一只IT小小鸟读后感》

    在我步入大学前,并未了解何为IT,真是毫无知晓.由于种种原因最终还是选择了软件工程专业,是 对是错,是福是祸,不知该不该去考虑,但即已然 选择了这条路,便得付出一些努力,这个世界总 是有许多在默默努力 ...

  3. What a Ridiculous Election UVALive - 7672 (BFS)

    题目链接: E - What a Ridiculous Election  UVALive - 7672 题目大意: 12345 可以经过若干次操作转换为其它五位数. 操作分三种,分别为: 操作1:交 ...

  4. Pycharm新建模板默认添加作者时间等信息

    在pycharm使用过程中,对于每次新建文件的shebang行和关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择File-Settings 2. ...

  5. Fork别人的代码 原作者更新后如何同步

    给主题的fork加一个remote 给 fork 配置一个 remote 使用 git remote -v 查看远程状态 ➜ next git:(master) git remote -v origi ...

  6. django反向解析传参

    这两天写代码总是有反向解析传参顺带复习了一下反向解析,以下是简单的反向解析 以下是我最近写的很多的反向解析传参  想要实现点击修改将这些从数据库读取的内容传到另一个页面就要通过id来查询,那么我们就需 ...

  7. TCP-IP详解学习笔记1

    TCP-IP详解学习笔记1 网关可以在互不相关的网络之间提供翻译功能: 体系结构: 协议和物理实现,实际上是一组设计决策. TCP/IP协议族允许计算机,智能手机,嵌入式设备之间通信: TCP/IP是 ...

  8. 11.2.0.4 aix下运行第二个节点root.sh报错处理

    第二个节点运行root.sh报错如下 Entries will be added to the /etc/oratab file as needed by Database Configuration ...

  9. React native 无法弹出调试控件的问题

    React Native 在debug模式下,可以通过摇动手机,弹出调试选项.但是今天利用了cocoapods 把react native 文件整理后,调试界面就弹不出了,其他功能正常.查了好久,发现 ...

  10. 详解HTTPS、TLS、SSL

    HTTPS.TLS.SSL HTTP也称作HTTP over TLS.TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3.下 ...