面向对象概述:
首先,不得不提的是面向对象是一种编程思想,其次,通过对象之间的相互调用和相互协作来完成开发;达到快速开发的目的;大多数用于大型项目开发:
类和对象:python中的对象,一般分为两种:
内置对象
自定义对象
python已经提供了大量的内置对象,方便我们的操作,如数字对象、字符串对象、列表对象、字典对象、元组对象、集合对象、等等;但是又说了~内置对象是不是能描述我们项目中用到的所有的数据类型呢?明显这是不可能的,没有任何一门编程语言能内置好这个世界上出现的或者未曾出现的各种对象,所以除了内置对象,我们还需要自定义对象,自定义类型和对象也是我们本章开始说的重点的内容
2.1. 内置对象
python的内置对象,一般都和我们使用的python模块有莫大的关系,官方纯粹的python中就内置了大量的对象
内置对象 描述 使用方式
数字对象 数字在python中就是对象 1、3.14
字符串对象 字符串也是对象 “hello”
列表对象 List [1,2,3,4,5,6,7]
元组对象 tuple (1,2,3,4,5,6)
集合对象 set {1,2,3,4,5,6,7,8}
字典对象 dict {"name":"jerry", "age":56}
文件对象 file myFile = open("d:/abc.txt")
其他对象 其他使用的模块 easygui.msgbox("你好")
2.2. 自定义类型和对象
类:就是一种数据的类型,就是一种类型,简称类。是对一部分具有相同特征(属性)和相似行为(方法)的对象的抽象。
如:人类,就是一种类,人类表示的是人的类型,类型只是一个描述数据的概念,是一个代号,不是实际存在的事物;这个类可以定义人具有的特征和行为,定义特征(姓名、年龄、性别),定义行为(吃饭、睡觉、工作)。
对象:对象就是某个类表示的具体的实际存在的事物了,具有具体数据来描述自己的特征,也有具体的行为操作。
如:张小凡,就是一个具体的人,有自己具体数据描述的特征(姓名:张小凡、年龄:22、性别:男),有自己具体的行为(吃烧鸡、睡大床、工作->砍竹子)
大师:类,就是类型,是一种数据类型,是一部分具有共同特征(属性)和行为(方法)的对象,抽象出来的一个概念、一个代号。
对象,就是类描述的类型中一个具体存在的事物,是一个具有明确特征数据和行为操作的物体。
- python中定义类和创建对象
定义类的步骤:
首先根据我们操作的对象来抽象共同的特征和行为,也称为属性和方法
通过python中的class关键字来定义一个类
在类中,定义这类事物的属性和方法
在使用时,通过类名称()的语法来创建对象
定义类的语法结构
class 类名称(object):
def init(self, 属性列表):
初始化属性
def 方法名称(self):
方法的操作代码
使用类来创建对象
变量名称 = 类名称(属性值)
3.1. 实际操作
3.1.1 通过一个模拟项目,来抽象一个类
创建一个游戏项目,游戏中有玩家的类型,玩家有昵称、账号、密码、职业等属性,有修炼的方法
定义玩家类型
class Player(object):
def init(self, nickname, username, userpass, userjob):
self.nickname = nickname
self.username = username
self.userpass = userpass
self.userjob = userjob
def growUp(self):
print(self.nickname + "在修炼中...")
面向对象的三大特征:
1.封装:
三大类
>> 数据封装
>> 行为封装
>> 属性封装[***]
1.1数据封装
~~原始数据存在的问题
表示一个用户[账号、密码、性别、昵称]
username = "admin"
password = "123"
gender = "男"
nickname = "小王"
四个变量互相没有关系~人为规定了 他们四个表示的是一个用户对象
这四个变量,随时可能被破坏他们的关系[username=True]
原始多个变量表示一个对象的方式:不稳定因素太大!
~~组合数据类型
表示一个用户,可以将多个数据存在一个组合数据类型变量中
user = {
"username": "admin",
"password": "123",
"gender": "男",
"nickname": "小王"
}
多个变量,被一个组合数据类型[字典]包装在一起
完成了多个数据之间的关联
他们依然不稳定!
user2 = {
"account": "admin",
"userpass": "123",
"sex": "男",
"nickname": "小王"
}
1.3封装属性
属性是属于对象的特征,对象的特征是属于对象的数据
对象的数据~一般不让外界直接访问
python中由于属性公开,对象可以直接调用,数据及其不安全,于是才有了封装属性一说:
封装通过语法限制,让属性私有化,不让外界直接访问
python中规定了,两个下划线开头的属性是私有的
语法上外界不能直接访问
依然存在问题:但是已经不是问题!
作为一个有经验的开发人员,你要知道怎么操作私有属性
知道:知道规范怎么操作;知道破坏性的语法怎么操作!
总结封装:
在python中,封装按照如下步骤进行操作
(1) 定义类型,所有属性私有化[双下划线开头]
(2) 每个属性提供set/get方法[赋值/取值]
命名规范:赋值:set_属性名称(..)
取值:get_属性名称(..)
(3) 在get/set方法中,提供限制条件!
封装的核心思想:
保障数据安全!
对象中的数据-> 对象的属性-> 属性数据安全-> 不能直接访问
对象的中的属性数据->间接访问得到【通过提供的访问方法】
访问方法:添加获取数据的限制条件、添加数据的限制代码!
2.继承
(1) 什么是继承
继承:让一个类型[子类]继承另一个类型[父类],相当于继承了父类中的公开的属性和方法
在子类中不需要重复编写即可使用,提高了代码的复用性!体现的是A is a B的关系
继承:体现的是类型的继承
如:宠物类型---宠物猫类型--> 宠物猫类型就是一种宠物类型!
继承基本语法:将要继承的父类,包含在当前类型声明的后面的括号中,体现当前类型
继承了指定的父类,就可以操作使用父类中的属性和方法
专业术语:
子类:一般通指当前类型
父类:一般通指被继承的类型;也称为:超类
语法体现:
class A: 父类:要被继承的类型
pass
class B(A): 子类:继承了A类型,可以使用A类型中公开的属性和方法
pass
继承的意义
子类中可以编写父类中没有的属性和方法
实现功能的扩展!
子类中可以重写,父类中已经在的方法【方法重写】
执行该方法的过程中,如果子类没有重写该方法,执行父类的方法
如果子类重写了该方法,直接执行子类的方法
方法重写:一般是指代继承关系中,子类中重新定义了父类中存在的方法
方法执行时,会动态根据是否重写执行父类/子类中的方法!
方法重载:[python没有方法重载]在一个类型中,出现了两个或者两个以上
相同名称的方法[参数不同],根据传递不同的参数执行不同的方法!
由于python弱类型语言的特性,已经在方法中具备了这样的功能
python中没有方法重载
非要给python添加一个方法重载的概念的话:@property--@method.setter
子类中调用父类的属性\方法
可以直接通过父类名称.属性/方法调用
可以通过super()关键字进行属性/方法的调用
一旦子类和父类之间互相调用属性或者执行方法时,就会出现多态操作
提示:写完代码就忘掉!
通过项目进行磨炼!
通过项目进行总结-> 什么是面向对象、什么是封装、什么是继承、什么是多态!
(3) 继承的操作使用方式:简单的案例【宠物就医】
(4) 继承扩展【多继承-广度优先 VS 深度优先】
多继承操作
python的多继承:体现的是 生活中 一个对象 会有多个角色的概念
注意问题:多继承出现的重名变量属性和行为方法[广度优先 & 深度优先]
3.多态
4.魔法属性和魔法方法
在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法)。如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名字)被python调用。而几乎没有直接调用它们的必要。
首先要讨论的第一个魔法方法是构造方法,它代表着类似于以前例子中使用过的那种名为init的初始化方法。但构造方法和其他普通方法不同的地方在于,当一个对象被创建后,会立即调用构造方法。
在python中创建一个构造方法只要将init方法的名字从简单的init修改为魔法版本__init__即可:
魔法属性:
访问器是一个简单的方法,它能够使用getHeight,setHeight这样的名字来得到或者重绑定一些特性。如果在访问给定的特性时必须要采取一些行动,那么像这样的封装状态变量就很重要。
今天要复习的就到这里了,以后还会有新的故事,尽请期待,
网友评论