Python之旅.第五章.面向对象 4.12

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 13.0px "PingFang SC"; color: #000066; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 13.0px Courier; color: #000066; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 10.0px 0.0px; line-height: 16.0px; font: 13.0px Verdana; color: #000066; background-color: #ffffff; min-height: 16.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 13.0px Courier; color: #000066; background-color: #ffffff; min-height: 16.0px }
span.s1 { }
span.s2 { font: 13.0px Courier }
span.s3 { font: 13.0px "PingFang SC" }

一、上节课复习

1、类中最常见的就是变量与函数的定义,并不是说一定要定义出变量与函数

2、程序中类并不完全等同于现实世界中的类,即可以是现实世界中存在的,也可是不存在的。

3、__init__方法

a.该方法内可以有任意的python代码;主要用于完成初始化,也可以有其他功能

b.一定不能有返回值

class People:

country=‘China‘

x=1

def __init__(obj, name, age, sex): #obj=obj1,x=‘egon‘,y=18,z=‘male‘

if type(name) is not str:

raise TypeError(‘名字必须是字符串类型‘)

obj.name = name

obj.age = age

obj.sex = sex

obj1=People(3537,18,‘male‘)  #主动崩程序

二、继承

#面向对象的三大特性:继承,封装,多态

1、什么是继承?

继承一种新建类的的方式,在python中支持一个儿子继承多个爹。

新建的类称为子类或者派生类,父类又可以称为基类或者超类;子类会”遗传“父类的属性。

2、为什么要用继承

减少代码冗余

3、怎么用继承

class ParentClass1:

pass

class ParentClass2:

pass

class Subclass2(ParentClass1,ParentClass2):

pass

print(Subclass2.__bases__)  #查父类,结果用元组形式显示

# 在python2中有经典类与新式类之分

# 在python3中全都为新式类

三、寻找继承关系

继承是类和类之间的关系,寻找这种关系需要先抽象再继承

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‘) #OldboyTeacher.__init__(...)

stu1=Oldboystudent(‘alex‘,73,‘female‘)

print(tea1.name,tea1.age,tea1.sex)

#定义阶段和使用阶段要分开

四、基于继承再看属性查找

class Foo:

def f1(self):

print(‘Foo.f1‘)

def f2(self): #self=obj

print(‘Foo.f2‘)

self.f1() #obj.f1()    # obj先找自己内部,然后去类Bar中就找到f1,不会找到父类Foo中的f1,即不是就近寻找

class Bar(Foo):

def f1(self):

print(‘Bar.f1‘)

obj=Bar()

obj.f2()

结果:

Foo.f2

Bar.f1

五、派生

派生:子类定义自己新的属性,如果与父类同名,以子类自己的为准

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 change_score(self):

print(‘teacher %s is changing score‘ %self.name)

def f1(self):

print(‘儿子的f1‘)

tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘)

tea1.f1()     #儿子的f1

六、在子类派生出的新方法中重用父类的功能

方式一:指名道姓地调用(其实与继承没有什么关系的)

class OldboyPeople:

school = ‘oldboy‘

def __init__(self, name, age, sex):

self.name = name

self.age = age

self.sex = sex

def tell_info(self):

print("""

===========个人信息==========

姓名:%s

年龄:%s

性别:%s

""" %(self.name,self.age,self.sex))

class OldboyTeacher(OldboyPeople):

def __init__(self, name, age, sex, level, salary):

OldboyPeople.__init__(self,name, age, sex)

self.level = level

self.salary = salary

def tell_info(self):

OldboyPeople.tell_info(self) #仅仅是调用一个函数,和继承无关,需要传参

print("""

等级:%s

薪资:%s

""" %(self.level,self.salary))

tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘, 9, 3.1)

tea1.tell_info()

方式二:super()调用(严格依赖于继承)

super()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性

了解:在python2中,需要super(自己的类名,self)

class OldboyPeople:

school = ‘oldboy‘

def __init__(self, name, age, sex):

self.name = name

self.age = age

self.sex = sex

def tell_info(self):

print("""

===========个人信息==========

姓名:%s

年龄:%s

性别:%s

""" %(self.name,self.age,self.sex))

class OldboyTeacher(OldboyPeople):

def __init__(self, name, age, sex, level, salary):

super().__init__(name,age,sex)

self.level = level

self.salary = salary

def tell_info(self):

super().tell_info()  #是对象对类的调用,自动传参,严格遵循继承。

print("""

等级:%s

薪资:%s

""" %(self.level,self.salary))

tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘, 9, 3.1)

tea1.tell_info()

# 方式一和方式二不能混用

七.经典类与新式类

1、新式类:

继承object的类,以及该类的子类,都是新式类。

在python3中,如果一个类没有指定继承的父类,默认就继承object;所以说python3中所有的类都是新式类

2、经典类(只有在python2才区分经典类与新式类):

没有继承object的类,以及该类的子类,都是经典类

class Foo(object):

pass

class Bar(Foo):

pass

print(Bar.__bases__)

八、在多继承背景下的属性查找

a. 非菱形时,经典型和新式型的查找顺序一致,从左至右一条条找

# F->D->B->E->C

class B:

def test(self):

print(‘from B‘)

pass

class C:

def test(self):

print(‘from C‘)

pass

class D(B):

def test(self):

print(‘from D‘)

pass

class E(C):

def test(self):

print(‘from E‘)

pass

class F(D,E):

def test(self):

print(‘from F‘)

pass

f1=F()

f1.test()

b.菱形继承的背景下,查找属性

1、经典类:深度优先

在python2中,A为经典类,F->D->B->A->E->C

2、新式类:广度优先

在python3中,A为新式类,F->D->B->E->C-A->object

class A:

def test(self):

print(‘from A‘)

pass

class B(A):

def test(self):

print(‘from B‘)

pass

class C(A):

def test(self):

print(‘from C‘)

pass

class D(B):

def test(self):

print(‘from D‘)

pass

class E(C):

def test(self):

print(‘from E‘)

pass

class F(D,E):

def test(self):

print(‘from F‘)

pass

f1=F()

f1.test()

print(F.mro())

# [<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>]

#只有新式类中有F.mro(),将查找关系显示成列表, mro()为内置方法

九、super()依赖继承

super()会严格按照mro列表从当前查找到的位置继续往后查找

class A:

def test(self):

print(‘A.test‘)

super().f1()

class B:

def f1(self):

print(‘from B‘)

class C(A,B):

pass

c=C()

print(C.mro()) #C->A->B->object  # [<class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘__main__.B‘>, <class ‘object‘>]

c.test()

结果:

A.test

from B  #在A中的调用super()会按照mro() z找到B中的f1,而不会去object中找

原文地址:https://www.cnblogs.com/yangli0504/p/8809795.html

时间: 2024-11-05 21:57:43

Python之旅.第五章.面向对象 4.12的相关文章

[python核心编程] 第五章练习题

第五章 数字 5-2. 操作符,写一个函数,计算并返回两个数的乘积“整理的时候才看到我把题目看成两个数的和了” 5-3. 标准类型操作符.写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分成绩(A-F) A:90~100 B:80~89 C:70~79 D:60~69 F:<60 5-4. 取余.判断给定年份是否是闰年.使用下面的公式. 一个闰年后就是指他可以被4整除,但不能被100整除,或者它可以被400整除. [python核心编程] 第五章练习题,布布扣,bubuko.com

Python核心编程第五章习题

Python核心编程-第五章-习题 5.1  整形,讲讲Python普通整形与长整形的区别? Python的标准整形类型是最通用的数字类型.在大多数32位机器上,标准整形类型的取值范围是-2**32-2**32 - 1. Python的长整型类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关,换句话说,Python能轻松表达很大的整数. 长整型类型是标准整形类型的超集,当程序需要使用比标准整形更大的整型时,可以使用长整型类型,在整型值后面添加L,表示这个为长整型,3.0版本已经统一称为为整

Python之旅(七)面向对象

三大编程范式 三大编程范式(这三者各有千秋,不分好坏): 面向过程编程 函数式编程 面向对象编程 面向过程编程 “面向过程”(Procedure Oriented)是一种以过程为中心的编程思想. 过程是指解决问题的步骤.例如问题:如何把大象放入一个冰箱?步骤:先打开冰箱,在将大象放入冰箱,最后关上冰箱.面向过程是一种较机械式的思维方式. 优点: 复杂的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单). 性能比面向对象高,因为类调用时需要实例化,比较消耗

《Python学习手册 第五版》 -第12章 if测试和语法规则

本章节的内容,主要讲解if语句,if语句是三大复合语句之一(其他两个是while和for),能处理编程中大多数逻辑运算 本章的重点内容如下: 1.if语句的基本形式(多路分支) 2.布尔表达式 3.if三元表达式 以下是针对重点内容的详细说明 1.if语句的基本形式 if语句是根据测试结果,从一些备选的操作中做出选择的语句,也就是说要先计算测试结果,再选择做什么,基本形式如下: if test1: statements1 elif test2: statements2 else: stateme

2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构

知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如Trondheim的hammer dance). 鉴于这一教程的目的在于使人尽量快速入门Python, 而任何不熟悉的词汇都会加上不必要的负担. 于是最终决定不拘泥于与原例程的"形似", 而采取在例程中使用更为国人熟知的词汇了. 中文代码示例Python入门教程 5.1 列表详述_哔哩哔哩

第五章 面向对象编程设计与开发——续3

5.9--封装 如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅是一种变形操作 #类中所有双下划线开头的名称如_x都会自动形成:_类名_x的形式: class A: _N=0#类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如_N,会变形为_A_N def _init_(self): self._x=10#变形为self._A_X def _foo(self):#变形为_A_foo print('form A') def bar(s

C++primer第十五章. 面向对象编程

面向对象编程基于三个基本概念:数据抽象.继承和动态绑定. 15.1. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism). 之所以称通过继承而相关联的类型为多态类型,是因为在许多情况下可以互换地使用派生类型或基类型的“许多形态”.正如我们将看到的,在 C++ 中,多态性仅用于通过继承而相关联的类型的引用或指针. 继承 派生类(derived class)能够继承基类(baseclass)定义的成员,派生类可以无须改变而使用那些与派生类型具体特性不相关的操作,派生类可以

Python之旅.第三章.函数3.28

一.命名关键字参数: 什么是命名关键字参数?格式:在*后面参数都是命名关键字参数特点:1 必须被传值1 约束函数的调用者必须按照key=value的形式传值2 约束函数的调用者必须用我们指定的key名 def foo(x,y,*,z): #创建foo函数,z为命名关键字参数 print(x,y,z)#foo(1,2,aaa=3) #报错,z为命名关键字参数,只能用用关键字z=值foo(1,2,z=3) ------------------------------def auth(*args,na

第五章.面向对象.总结

面向对象编程 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式 优点:复杂的问题流程化.进而简单化 缺点:可扩展性差 2.面向对象 核心"对象"二字,对象指的是特征与技能的结合体, 基于该思想编写程序就好比在创造一个世界,你就是这个世界的上帝,是一种 上帝式的思维方式 优点:可扩展性强 缺点:编程的复杂度高于面向过程 对象与类 1.对象是特征与技能的结合体,那类就是一