面向对象

一.  面向对象介绍

对象:万物皆对象。现实世界中我们能见到的,能触碰到的所有人和事物都是对象,如人,猫,狗,汽车等。在计算机世界中里,我们用虚拟的编程代码将现实世界里的事物抽象成对象,然后用面向对象编程思想来解决现实世界中的种种难题。对象可以是有形的,也可以是无形的。人们在认识世界时,会将对象简单处理为两个部分--属性和行为。

对象具有属性,它可以称为状态,也可以称为变量。正如每个人都有姓名,年龄,身高,体重等属性。

同一类的对象虽然具有相同的属性,但是其中每个对象是不同的,这表现为每个对象各自的属性值并不相同。

对象具有行为,也可以称为方法。面向对象编程将完成某个功能的代码定义为方法,方法可以被其他程序调用,也可以被对象自身调用。

:是相同类似对象的统称。类是对象的抽象,对象则是类的实例化,具体化,每个对象都包括了类中定义的属性和行为。

类是对象的属性和行为被进一步封装的模板,不同的类之间的属性和行为都是不同的。在编程语言中,类的属性是以成员属性(也可称成员变量)来定义的,类的行为是以成员方法来定义的。

二. Python与面向对象

1. 介绍

类(Class):用来描述具有相同的属性和方法的对象集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外,通常不作为实例变量使用。

数据成员:类变量或者实例变量,用于处理类及其实例对象的相关数据。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(Override),也称为方法的重写。

实例变量:定义在方法中的变量,只作用于当前实例的类。

继承:指一个派生类(Derived Class)继承基类(Base Class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。

实例化:创建一个类的实例,一个类的具体对象。

方法:类中定义的函数。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

2. 定义语法

class    [类名]:

  [语法块]

注意:类名和变量名一样区分大小写。字母相同但是大小写不同的类会被解释器视为两个不同的类。

3. 类的使用

在使用类之前需要实例化类,类实例化后会成为常见对象。创建对象和创建变量类似,需要先声明对象是哪个类,同时指明变量名称。

执行结果如下:

这个例子创建一个EmptyClass对象,变量名称为“empty”,同时在内存中为这个对象分配了内存空间。

4. 类的构造方法

在创建实例时,很多类可能都需要有特定的初始状态。所以,一个类可以定义一个特殊的方法,叫构造函数。在Python中,构造函数就是类的__init__方法。

定义和使用构造函数:

 当一个类定义了__init__方法,类在实例化时会自动调用__init__方法,用于创建新的类实例。在这个例子中,新的实例被创建,同时执行了构造方法,运行了print函数。注意:构造函数的第一个参数是“self”,不能漏掉。

还有一点需要注意的是,构造方法的返回值必须是“None”。在定义构造方法的时候解释器不同报错,但是在实例化的时候Python会输出错误提示“TypeError:__init__() should return None”。

5. 类的属性

在构造方法中可以初始化一些属性。例如:

 注意:属性(或者叫成员变量,类变量)必须要使用“self”加上点的方式赋值,不能直接定义变量。直接定义的变量的生命周期只会在函数内,函数执行完变量就会被销毁。

 6. 类中的方法

在类中定义的函数称为方法。

 从这个例子可以看出,类中的方法和函数定义的方法基本相同。除了方法一定要定义在类里面并且第一个参数必须是“self”(参数名字不强制要求为“self”,但是一般使用名字“self”已与其他参数作区分)外,其他函数定义的方法没有任何区别。

7. 私有属性

在构造函数中定义了属性,实例可以轻松地获取和修改属性的值。但是有时候我们需要限制实例随意修改属性,这时候就要用到私有属性。定义私有属性很简单,只要在定义属性名字的时候使用两条下划线zuozuo为开头,Python解释器就认为这个属性是私有的,外部不能随意访问这个属性。

 8. 私有方法

私有属性是只能在类内部被操作的属性,同样地,方法也有私有方法,和私有属性一样,私有方法只能在类内部被调用,实例不能直接调用。

三. 继承和多态

面向对象编程具有三大特性-封装性,继承性和多态性,这些特性使程序设计具有良好的扩展性和健壮性。

1. 继承

定义:是一种对类进行分层级划分的概念。继承的基本思想是在一个类的基础上制定出一个新的类,这个新的类不仅可以继承原来类的属性和方法,还可以增加新的属性和方法。原来的类被称为父类,新的类被称为子类。

一般情况下,编程语言没有限制一个类可以继承的父类数量,一个子类可以有多个父类。

定义子类语法:

 说明:定义要从哪个父类继承,只需在定义子类的名字后面的括号中填入父类的名字,如果有多个父类则用逗号“,”隔开。

注意点

(1)在继承中,如果子类没有定义构造方法,则父类的构造方法可以自动调用;

(2)在继承中,如果子类定义了构造方法,则父类的构造方法__init__不会被自动调用,需要在子类的构造方法中专门调用。

 :使用super函数调用“Animal”的构造函数。

 (3)子类不能继承父类中的私有方法,也不能调用父类的私有方法。

2. 多态

定义:意思就是多种形态。多态意味着即使不知道变量所引用的对象是什么类型,也能对对象进行操作。多态会根据类的不同而表现出不同的行为。

例如:当子类和父类存在相同的方法时,子类的方法会覆盖父类的方法,这样代码在运行时总会调用子类的方法,这就是多态。

 3. 鸭子类型

定义:Duck Typing 是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口决定的,而是由当前方法和属性的集合决定的。

 说明:在例子中Dog和Cat并没有从Animal继承下来,但是都各自实现了say方法,这就是“多态”的一种实现方式。因为Python是一门动态语言,在函数没有被执行的时候,程序并不能断定数据的类型(虽然可以使用函数注释做限制,但是这并不是强制性的),只有执行到相关的语句时才真的去调用相关的方法。所以虽然我们没有使用“继承”,但是我们仍然可以实现多态。

四. 小结

1. 类变量和实例变量

定义:实例变量是构造方法中的初始化属性,类变量是定义在类的时候定义的。

区别:类变量不需要实例化就能直接使用,相当于直接绑定在类上,而不是绑定在实例上。但是类变量在实例中也是可以被调用的。

 注意:实例不能修改类变量,如果实例对类变量进行修改,Python解释器会新建一个同名的成员变量来代理实例中的类变量。

2. 静态方法与类方法

静态方法:和类方法有点类似,静态方法在定义类的时就已经被分配定义好了。静态方法并不绑定类,也不绑定实例,相当于给方法添加一个前缀。定义静态方法将引入一个新的概念--装饰器。

定义静态方法

 说明:定义静态方法就是在定义函数的上面一行(不能有空行)添加“@staticmethod”。静态方法不再有第一个默认参数“self”,所以静态方法本身也不能调用成员变量和成员方法。静态方法不需要实例化之后使用,和类变量一样直接使用即可,其他的和一般的函数没有区别。

类方法:是该方法绑定在类上面,而不是绑定在实例上。

定义类方法

 说明:定义类方法和静态方法有点类似,就是在定义函数的上面一行(不能有空行)添加一句装饰器语法“@staticmethod”。和静态方法不同的是,类方法和成员方法一样都有一个初始的参数,但是这个参数不同于成员方法。成员方法的第一个参数指向的是实例,而类方法指向的则是定义类的本身,所以类方法可以读取和修改类变量。

 

posted @ 2023-02-08 22:09  惟默  阅读(51)  评论(0编辑  收藏  举报