面向对象程序设计
面向对象概述
对象----抽象概念,英文称作"Object"
静态部分:被称为“属性”,任何对象都具备自身属性
动态部分:对象的行为,即对象执行的动作
类----封装对象的属性和行为的载体(具有相同属性和行为的一类实体被称为类)
雁群--大雁类
属性:翅膀和爪等
行为:觅食、飞行和睡觉
一只大雁则被视为大雁类的一个对象 -----对象是类的实例
面向对象程序设计的特点
封装----面向对象编程的核心思想
将对象的属性和行为封装起来
而将对象的属性和行为封装起来的载体就是类
类通常对客户隐藏隐藏其实现细节,这就是封装的思想
步骤一:(类将内部数据隐藏)类
步骤二:为用户提供对象的属性和行为的接口
步骤三:用户在不清楚类内部是如何构成的前提下,可以通过这些接口操作类,但是不能操作类中的内部数据
继承----实现重复利用的重要手段
类似于四边形的类称为父类或超类
类似于平行四边形的类称为子类
子类的实例都是父类的实例,不能说父类的实例是子类的实例
多态
将父类对象应用于子类的特征就是多态
父类 : 螺丝类 属性两个:粗细和螺纹密度
子类:长螺丝类 短螺丝类 长 短
(一个螺丝类衍生成不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果)
多态化的结构
类的定义与使用
定义类
class ClassName: -----class语句本身并不创建该类的任何实例
"类的帮助信息" # 类文档字符串
statement # 类体
ClassName:大写字母开头,多个单词,其他单词的首字母也是大写
类的帮助信息:用于指定类的文档字符串,定义该字符串后,创建类的<对象>时,输入类名和左侧的括号,将显示该信息
statement:类体,主要由类变量(或类成员)、方法和属性等定义语句构成。
创建类的实例 -----即实例化该类的对象
ClassName(parameterlist)
ClassName 是必选参数,用于指定具体的类
parameterlist 是可选参数
创建一个类时,没有创建__init__()方法,或者__init__()方法只有一个self参数时,parameterlist可以省略。
创建__init__()方法
创建类后,通常会创建一个__init__()方法。
该方法是一个特殊的方法,类似java语言中的构造方法。
每当创建一个类的新实例时,python都会自动执行它。
_init__()方法必须包含一个self参数,并且必须是第一个参数
self参数是一个指向实例本身的引用,用于访问类中的属性和方法,在方法调用时会自动传递实际参数self
创建类的成员并访问
类的成员: (在类中创建了类的成员后,可以通过类的实例进行访问)
实例方法
数据成员组成。
1、创建实例方法并访问
所谓实例方法,是指在类中定义的函数。----实现类中的一个行为,是类的一部分
该函数是一种在类的实例上操作的函数
实例方法创建
同__init__()方法一样,实例方法的第一次参数必须是self,并且包含一个self参数
def funtionName(self,parameterlist):
block
# funtionName:用于指定方法名,一般使用小写字母开头
# self:必要参数,表示类的实例,其名词可以使self以外的单词,使用self只是一个习惯而已
# parameterlist:用于指定除self参数以外的参数,各参数间使用逗号“,”进行分割
# block:方法体,实现的具体功能
实例方法访问
实例方法创建完成后,可以通过类的实例名称和点(.)操作符进行访问
instanceName.funtionName(parameterlist)
# instanceName:为类的实例名称
# funtionName:要调用的方法名称
# parameterlist:表示为方法指定对应的实际参数,其值的个数与创建实例中的parameterlist的个数相同
2、创建数据成员并访问
数据成员是指在类中定义的变量,即属性、根据定义位置,又可以分为类属性和实例属性
类属性:----可以通过类名称或者实例名称访问
定义在类中并且在函数体外的属性
类属性可以在类的所有实例之间共享值,也就是在所有实例化的对象中公用
通过类名称访问类属性
Geese.beak="" # 添加类属性
还可以动态地为类和对象添加属性
list1[1].break
也可以修改类属性。修改结构将作用域该类的所有实例
实例属性:----
定义在类的方法中的属性,只作用域当前实例中
实例属性只能通过实例名访问。如果通过类名访问实例属性,将抛出异常。
对于实例属性可以通过实例名称修改
class Geese: # 创建上面的类geese
geese = Geese() # 实例化一个雁类的对象
访问限制----为了保护类内部的某些数据或方法不被外部访问
1、_foo:以单下划线开头的表示protected(保护)
只允许类本身和子类进行访问
但不能使用“from module import *"语句导入
实例方法中访问保护属性
保护属性可以通过实例名访问
2、__foo:双下划线表示private(私有)类型的成员
只允许定义该方法的类本身进行访问
而且也不能通过类的实例进行访问
但是可以通过 类的实例名.类名__方式访问
私有属性可以在类的实例方法中访问
也可以通过实例名.类名__xxx方式进行访问
不能通过实例名+属性名访问
3、__foo__:首尾双下划线表示定义特殊方法,一般是系统定义名字,如__init__
属性
创建用于计算的属性
@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性
将方法转换为属性后,可以直接通过方法名来访问方法,而不需要添加一个小括号()
@property
def methonname(self):
block
# methonname 用于指定方法名,一般使用小写字母开头,该名称最后将作为创建的属性名
# self:必要参数,表示类的实例
# block: 方法体,表示实现的具体功能,在方法体中,通常以return语句结束,用于返回计算结果。
通过@property转换为的属性不能重新赋值
为属性添加安全保护机制
不能在类体外修改,可以将其设置为私有的
但设置为私有后,在类体外也不能获取它的值
如果想要创建一个可以读取但不能修改的属性,可以使用@property
通过属性不仅可以将属性设置为只读属性,而且可以为属性设置拦截器,即允许对属性进行修改,但修改时需要遵守一定的约束
继承
继承的基本语法
被继承的类称为父类或基类
新的·类称为子类或派生类
class ClassName(baseclasslist):
'''类的帮助信息''' # 类文档字符串
Statement # 类体
# ClassName:用于指定类名
# baseclasslist:用于指定要继承的基类,可以有多个,类名之间用“逗号”分隔,如果不指定,将使用所有python对象的根类object
# 类的帮助信息:用于指定类的文档字符串,定义该字符串后,创建类的<对象>时,输入类名和左侧的括号,将显示该信息
# statement:类体,主要由类变量(或类成员)、方法和属性等定义语句构成。
方法重写
基类的成员都会被派生类继承,当基类中的某个成员不完全适用于派生类中,就需要在派生类中重写父类的这个方法。
派生类中调用基类的__init__()方法
派生类中定义__init__()方法时,不会自动调用基类的__init__()方法
面向对象程序设计
![](https://img-home.csdnimg.cn/images/20240711042549.png)