一、面向对象的介绍
1.对象
对象是一种抽象概念,表示客观世界存在的实物,现实世界中能够看到的、触碰到的都可以成为对象,如:人、大象、小猫等。
对象通常分为两个部分,即静态部分和动态部分。静态部分为“属性”,任何对象都具备自身属性;动态部分为“行为”,即对象执行的动作。
2.类
具有相同属性和行为的一类实体被称为类,类是封装对象的属性和行为的载体。
【在Python中,类是一类抽象概念,可以定义每个对象共有的属性和方法,对象是类的实例】
3.面向对象的程序设计的特点
对象含义主要指万物皆对象;类是具有相同属性和功能的对象的抽象集合;对象就是类的实例。面向对象的程序设计共有三个基本特征:封装、继承和多态。
①封装
在面向程序的设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,对不可信的信息进行隐藏,使得代码模块化,保护数据不被其他函数的意外修改。并且从对象外面不能够直接访问对象的属性,只能通过和该属性对应的方法访问。
②继承
继承,一种对类进行分层划分的概念。继承的基本思想是在一个类的基础上制定出一个新的类,这个新的类不仅可以继承原来的类的属性和方法,还可以增加新的属性和方法,扩展已存在的代码块,实现代码重用。【一般情况下,一个子类只能有一个父类,子类覆盖在父类必须保证子类权限大于父类权限】
定义子类的语法如下:
class SubClass(BaseClass1,BaseClass2):
语法块
③多态
将父类对象应用于子类的特征就是多态。即“一个接口,多种方法”,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态可以实现接口重用。
示例:
从上述例子可以看出,当父类和子类存在相同的方法时,子类的方法会覆盖父类的方法,这样代码在运行时总会调用子类的方法,这就是多态。
二、类的定义和使用
1.类的定义
在Python中,类的定义是用class来实现的,其语法格式如下:
class ClassName:
'''类的帮助信息'''
Statement
参数说明如下:
ClassName:用于指定类名,一般用大写字母开头,如果类名中包括两个单词,第二个单词的首字母也要大写,这种命名方法也成为了“驼峰命名法”。
'''类的帮助信息''':用于指定类的文档字符串,定义该字符串后,在创建类的对象时,输入类名和左侧的括号“(”后,将显示该信息。
Statement:类主要由类变量(或类成员)、方法和属性等定义语句组成。如果在定义时,没想好类的具体功能,也可以在类体中直接使用pass语句代替。
2.创建 _ _init_ _() 方法
在创建类之后,类通常会自动创建一个 _ _init _ _() 方法,该方法是一个特殊的方法,类似Java中的构造方法。每当创建一个新的类的实例时,Python都会自动执行它。_ _init_ _() 方法必须包含一个self参数,并且必须时第一个参数。self参数是一个指向实例本身的引用,用于访问类的方法和属性。在方法调用时会自动传递实际参数self。因此,当_ _init_ _() 方法只有一个参数时,在创建类的实例时,就不需要指定实际参数了。
class People:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
三、属性
1.属性存在的意义
(1)访问属性时可以制造出和访问字段完全相同的假象,属性由方法衍生而来,如果Python中没有属性,方法完全可以替代其功能。
(2)定义属性可以动态获取某个属性值,属性值由属性对应的方法实现,应用更加灵活。
(3)可以制订直接的属性规则,用于防止他人随意修改属性值。
2.操作属性的三种方法
(1)使用@property装饰器操作类属性
class Demo:
@property
def methodname(self):
block
参数说明如下:
methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性名。
self:必要参数,表示类的示例。
block:方法体,表示实现的具体功能。在方法体中,通常以return语句结束,于是返回计算结果。
定义时,在普通方法的基础上添加@property装饰器,属性仅有一个self参数,调用时无需括号,该方法的优点包括:
①@property装饰器可以实现其他语言所拥有的getter、setter和deleter的功能。
②通过@property装饰器可以对属性的取值和赋值加以控制,提高代码的稳定性。
(2)使用类或实例直接操作属性
这种方法的缺点是对类的属性没有操作控制规则,容易被人修改。
(3)使用Python内置函数操作属性
①getattr(obj,name[,default]):访问对象的属性,如果不存在返回对象属性的值,则会抛出AttributeError异常。
②hasattr(obj,name):检查是否存在某个属性,存在返回True,否则返回False。
③setattr(obj,name,value):设置一个属性。如果属性不存在,会创建一个新的属性,该函数无返回值。若存在则更新这个值。
④delattr(obj,name):删除属性,如果属性不存在则抛出AttributeError异常,该函数也无返回值。
四、继承
1.继承的基本语法
继承允许我们定义一个类时,让该类继承另一个类的所有方法和属性。
父类是被继承的类,也称为基类;子类是继承父类的类,也称为派生类。
继承概念的实现方式主要有两类:实现继承、接口继承。
(1)实现继承是指使用基类的属性和方法而无须额外编码的能力
(2)接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力(子类重构父类方法)。
2.方法重写
当我们调用一个方法的对象时,会优先去当前对象中寻找是否具有该方法,如果有则直接调用,如果没有则去对象的父类中寻找,如果父类中有则直接调用父类中的方法,如果没有则还是去父类的父类中寻找,以此类推,直到找到object,如果始祖父类中也没有,就会报错。
示例: