第五章.面向对象.总结

面向对象编程

1、面向过程编程

核心是”过程“二字,过程指的是解决问题的步骤,即先干什么再干什么

基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式

优点:复杂的问题流程化、进而简单化

缺点:可扩展性差

2、面向对象

核心”对象“二字,对象指的是特征与技能的结合体,

基于该思想编写程序就好比在创造一个世界,你就是这个世界的上帝,是一种

上帝式的思维方式

优点:可扩展性强

缺点:编程的复杂度高于面向过程

对象与类

1、对象是特征与技能的结合体,那类就是一系列对象相同的特征与技能的结合体

2、在现实世界中:一定先有对象,后来随着人类文明的发展总结出的类;对象是具体存在的,而类只是一种抽象概念

3、在程序中,务必保证:先定义类,后调用类来产生对象

#根据现实世界中的对象归纳现实世界的类,然后在程序中定义类,之后调用这个定义的类才产生程序中的对象

程序中的类

class OldboyStudent:  #用驼峰体表示类名, 变量名不推荐驼峰体

# 用变量表示特征

school="Oldboy"

#  用函数表示技能

def learn(self):

print(‘is learning...‘)

def choose(self):

print(‘choose course...‘)

注意:在定义类的阶段会立刻执行类体内的代码,然后将产生的名字存放于类名称空间中

#名称空间用字典存数据

print(OldboyStudent.__dict__)  # . 后面的是属性

调用类发生哪些事:

1、首先会产生一个空对象stu1

2、会自动触发类内部的__init__函数

3、然后将空对象stu1连同调用类时括号内的参数组成(stu1,"马冬梅",18,‘female‘),将这四个参数一起传给__init__函数

stu1=OldboyStudent("马冬梅",18,‘female‘)  #OldboyStudent.__init__(stu1,"马冬梅",18,‘female‘)

stu2=OldboyStudent("甜蜜蜜",21,‘male‘) #OldboyStudent.__init__(stu2,"甜蜜蜜",21,‘male‘)

stu3=OldboyStudent("原石开",22,‘male‘)

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

# .左边一定是一个名称空间。.右边是属性

对象的使用

调用类---》产生类的对象,该对象也可以称为类的一个实例,调用类的过程也称为类的实例化

stu1=OldboyStudent(‘李三胖‘,18,‘male‘) #OldboyStudent.__init__(stu1,‘李三胖‘,18,‘male‘)

stu2=OldboyStudent(‘王大炮‘,28,‘male‘)

先在对象的名称空间中查找,若查不到接着去类的名称空间中查找,若依然查不到则报错,不会去全局名称空间中查找。

print(stu1.school)  #但前缀,只在对象及类的名称空间查找

print(school)  #不带前缀,查的是全局名称空间中的名字

类内部定义的变量是给所有对象共享,所有对象指向的都是同一个内存地址

print(id(stu1.school))

print(id(stu2.school))

print(id(OldboyStudent.school))   #以上三者的id一致

类内部定义的函数,类可以使用,但类来用的时候就是一个普通函数,普通函数有几个参就传几个参数

print(OldboyStudent.learn)

OldboyStudent.learn(123)

类内部定义的函数,其实是给对象使用的,而且是绑定给对象用,绑定给不同的对象就是不同的绑定方法(bound method)

print(stu1.learn)

print(stu2.learn)

绑定方法的特殊之处在于,谁来调用,就会将谁当作第一个参数自动传入

一切皆对象:

类与类型是一个概念(在python3中,统一了类与类型的概念)

平时用的那些类型,全都是类

类与对象总结:

1.类的实例化:调用类产生对象的过程称为类的实例化,实例化的结果是一个对象,或称为一个实例

实例化做了三件事

a、先产生一个空对象

b、自动触发类内部__init__函数的执行

c、将空对象,以及调用类括号内传入的参数,一同传给__init__,为对象定制独有的属性

2.对象的操作

用对象名.属性名进行操作

3.对象属性的查找顺序:先找对象自己的名称空间----》类的名称空间

a.类的数据属性:是给对象用的,而且直接共享给所有对象用的,内存地址都一样

b.类的函数属性:也是给对象用,但是绑定给对象用的,绑定到不同的对象就是不同的

绑定方法,内存地址都不一样,但其实只想都是同一个功能

4.绑定方法的特殊之处:

a.绑定给谁就应该由谁来调用,

b.谁来调用就会把谁当做第一个参数传入

5.一切皆对象:在python3中统一了类与类型的概念,类即类型

注意:

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

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

3、__init__方法

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

b.一定不能有返回值

继承

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

1、什么是继承?

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

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

2、为什么要用继承

减少代码冗余

3、怎么用继承

class ParentClass1:

pass

class ParentClass2:

pass

class Subclass2(ParentClass1,ParentClass2):

pass

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

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

# 在python3中全都为新式类

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

基于继承再看属性查找:

先找自己内部,然后去类中就找,不会直接找到父类,即不是就近寻找

派生

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

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

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

用类名直接调用

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

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

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

方式一和方式二不能混用

经典类与新式类

1、新式类:

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

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

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

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

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

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

经典类:深度优先

在python2中,class Teacher:为经典类

2、新式类:广度优先

在python3中,class Teacher:为新式类 (自动加父类object)

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

super()依赖继承

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

组合

解决类与类之间代码冗余问题有两种解决方案:1、继承 2、组合

1、继承:描述的是类与类之间,什么是什么的关系

2、组合:描述的是类与类之间的关系,是一种什么有什么关系;一个类产生的对象,该对象拥有一个属性,这个属性的值是来自于另外一个类的对象

组合不属于继承

类的使用将变量及处理其的函数捆绑起来

继承是强耦合,组合是解耦合

如何封装以及封装的目的

1、什么是封装:

装就是把一堆属性存起来,封的概念就把这些属性给隐藏起来

强调:封装单从字面意思去看等同于隐藏,但其实封装绝对不是单纯意义的隐藏

2、如何用封装

如何把属性隐藏起来,就在属性前面加上__开头(注意不要加__结尾)

注意:

a、其实这种隐藏只是一种语法上的变形,对外不对内

为一个属性名加__开头(注意不要加__结尾),会在类定义阶段将属性名统一变形:_自己的类名__属性名

b、这种语法意义上变形,只在类定义阶段发生一次,类定义之后,新增的__开头的属性都没有变形的效果

c、如果父类不想让子类覆盖自己的方法,可以在方法名前加__开头

3、为什么要用封装

a、封装数据属性的目的:把数据属性封装起来,然后需要开辟接口给类外部的使用者使用,好处是我们可以在接口之上添加控制逻辑,从而严格空间访问者对属性的操作

b、封装函数属性的目的:为了隔离复杂度

c、封装的终极奥义:明确地区分内外,对外是隐藏的,对内是开放的

封装的property

用@调用

将方法伪装成数据属性!

@name.setter #obj.name=‘EGON‘ # @property装饰的函数可以调用setter及deleter

setter用于该,deleter用于删

property, classmethod和staticmethod为面向对象中的三大函数

用装饰器property将数据属性藏起来,进行查改删操作,用户无感

多态

什么是多态:多态指的是同一种事物多种形态

为什要用多态:用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以在不用考虑对象具体类型的前提下而直接使用对象下的方法。多态在程序中表现可以是继承,但单纯意义伤的继承无法让父类严格限制子类。

多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法

如何用多态

import abc #abstract class

class Animal(metaclass=abc.ABCMeta):

@abc.abstractmethod

def eat(self):

pass

@abc.abstractmethod

def drink(self):

pass

@abc.abstractmethod

def run(self):

pass

@abc.abstractmethod

def bark(self):

pass

创建一个虚拟父类用来限定规则,子类必须携带父类所有的方法!

鸭子类型

即程序员中默认的类型规定,

多个类有相同功能,不用管类是什么,记忆一套功能即可调用全部类

classmethod和staticmethod

1 绑定方法:

在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法。  #什么装饰器都不加

绑定对象的方法特殊之处:应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入。

绑定到类的方法特殊之处:应该由类来调用,类来调用,会自动将类当作第一个参数传入。  #加classmethod装饰器

总的来说,类中的函数可和对象绑定,可和类绑定(classmethod),也可随都不绑定(statismethod)

staticmethod:非绑定方法,就是一个普通函数

特性:既不跟类绑定,也不跟对象绑定,这意味着谁都能用;谁来用都是一个普通函数,也就是说没有自动传值的特性了

classmethod:类绑定方法

特性:跟类绑定,调用该方法,会把类自动传递过去,一般用于在方法中实例化

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

时间: 2024-08-27 05:19:48

第五章.面向对象.总结的相关文章

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

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

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-co

第五章 面向对象编程设计与开发——续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

第五章.面向对象(上)

类:可被认为是一种自定义的数据类型,可使用类来定义变量,所有使用类定义的变量都是引用变量,所有的类是引用类型. Java程序使用类的构造器来创建该类的对象. Java支持面向对象的三大特征:封装.继承.多态: java提供了private.protected.public访问控制修饰符来实现封装,提供extends关键字让子类继承父类,有了继承就有了多态. 构造器用于对类的实例进行初始化操作,构造器支持重载,若多个重载构造器里包含了相同的初始化代码,可以把这些初始化代码放置在普通初始化块里完成,

第五章 面向对象(二)

5 面向对象的特征 封装 继承 多态 5.1 封装    隐藏对象的属性和实现细节,仅对外提供公共访问方式    好处: 便于使用 提高重用性 提高安全性 例如:函数(最小的封装体).类.包.框架. 5.2 继承   1.继承的特点 提高了代码的复用性. 类和类之间之间产生了关系,从而有了多态的特性. java只支持单继承,以为多继承容易带来安全隐患:当多个父类中定义了相同功能,但功能内容不同时,子类对象不确定运行哪一个.但是java保留了这种机制,用接口来完成多实现. java支持多层继承.

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

5.1   类.实例.属性.方法详解 类的语法 上面的代码其实有问题,属性名字和年龄都写死了,想传名字传不进去. class Person(object): def __init__(self, name, age): self.name = name self.age = age p = Person("Alex", 22) print(p.name, p.age) 为什么有__init__? 为什么有self? 此时的你一脸蒙逼,相信不画个图,你的智商是理解不了的! 画图之前, 你

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

5.4--小结 从代码级别看面向对象 1.在没有学习类这个概念时,数据和功能是分离的 def exc1(host,port,db,charset): conn=connect(host,port,db,charset) conn.execute(sql) return xxx def exc2(host,port,db,charset,proc_name) conn=connect(host,port,db,charset) conn.call_proc(sql) return xxx #每次调

第二十五章 面向对象------封装、内置函数、反射、动态导入

1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性的权限分为两种: 1.公开的 没有任何限制,谁都可以访问 2.私有的 只有当前类本身能狗访问 默认为公共的 为什么要封装? 1.提高安全性 封装属性 2.隔离复杂度 封装方法 一个类中分为两种数据:属性和方法 封装属性 class Student: def __init__(self,name,ag

第五章 面向对象

1.简述面向对象和面向过程的区别和联系? 两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想.比喻面向过程是蛋炒饭,面向对象是盖浇饭.盖浇饭的好处就是“菜”“饭”分离,从而提高了制作盖浇饭的灵活性.饭不满意就换饭,菜不满意换菜.用软件工程的专业术语就是“可维护性”比较好,“饭” 和“菜”的耦合度比较低.区别编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类.属性及其方法,然后通过实例化类.执行方法来完成功能.封装性:都