目录
面向对象基础
面向对象 / 面向过程
面向过程编程
面向对象基本概念
面向对象-类和对象
类
对象
类和对象的关系:
类的设计
定义类名
属性和方法的确定
面向对象基本语法
定义简单的类(只包含方法)
定义类
self的使用
面向对象基础
面向对象 / 面向过程
一个思想、理论、逻辑。 独立于变成语言。理论来源于生活 、来源于人类的思考方式。
面向对象:适合解决大型、 复杂业务的项目 面向接口 面向过程 面向切片
面向过程:
根据业务逻辑从上到下写代码。 项目中解决部分问题的方案。
注重步骤与过程,不注重职责分工,代码会变得很复杂,没有套路,开发难度很大!
面向对象:
变量与函数绑定到一起,分类进行封装,每个程序 只要负责分配给自己的分类能更快 速的开发程序,减少重复代码。整体项目解决方法(化简逻辑,让代码更简单)
抽象的概念:
面向对象的思想就是抽象的思想即人类认识世界的思想 面向对象的过程就是抽象的过程即人类认识世界的过程
面向过程编程
不推荐使用(了解即可)
面向过程编程的关注点在于怎么做
把完成某一个需求的 所有步骤 从头到尾 逐步实现。
根据开发需求,将某些 功能独立 的代码 封装 成一个又一个 函数。
最后完成的代码,就是顺序地调用 不同的函数。
面向过程编程特点:
-
注重步骤与过程,不注重职责分工。
-
如果需求复杂,代码会变得很复杂。
-
开发复杂项目,没有固定的套路,开发难度很大!
面向对象基本概念
编程思想 -- 面向对象 -->整体项目解决方案
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)和面相过程编程,是两种不同的编程方式。
作用:
责任分发,变量与函数绑定到一起,分类进行封装,快速的开发程序,减少了重复代码。
面向对象程序设计 独立于编程语言。
每个程序只要负责分配给自己的分类 ;(社会的进步表现在 分工的越来越明确 )。
面向对象编程的关注点在于谁来做方法=函数=行为=动作。(责任分发)
相比较函数,面向对象是更大的封装,根据职责在 一个对象中封装多个方法。
在完成某一个需求前,首先确定职责 —— 要做的事情(方法)。
根据 职责 确定不同的 对象,在对象内部封装不同的方法(多个)。
最后完成的代码,就是顺序地调用不同对象的相应方法。
面向对象特点:
-
注重 对象和职责,不同的对象承担不同的职责。(分则)
-
更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路。
做一些工作 :要解决问题 就要模拟问题!
-
定义类:
将我大脑中的概念转移到 python中。 就在python中 定义一个类型、一个类别、一个模板。 使用 class 关键字、保留字 定义类。
-
类属性:
增强一下画像 、印象、特征(特别提醒:只描述 你自己业务的关注点) 属性 = 特征 (类属性)
-
定义功能函数:
责任 = 功能 = 能力 = 行为 = 能力 = 函数 定义函数: 面向对象中把 任 = 功能 = 能力 = 行为 = 能力 = 函数 。统统定义为函数。 定义函数 可以很复杂 也可以很简单。 因为 函数可以写逻辑代码 ,可以包含多行内容。
-
计算机属于先下定义 、在创建模板。
在现实生活中 :当我们看见遇见一个 实物 的时候:大脑会不自觉的去匹配大脑中的模板。
-
语法问题 : 1. 创建对象 对象名 = 类名() 2. 访问属性 、方法 对象名.属性名 /方法名 3. 属性赋值 对象名.属性名 = 值
面向对象-类和对象
类和对象是面向对象编程的两个核心概念。 注意:在开发中 ,先有类,再定义对象。
类:
是对一系列具有相同 特征 和行为的一个统称,抽象的,不能直接使用(不是真是存在的实物)
类的作用:
类是用来创建对象的。
类:是概念 比如说(猫类 ,狗类 等 )
类:是一个概念 谁都可以定义 (经常要使用而且经常要自定义) 一类 :一定是具有相同特的。
-
特征就是一个变量,在类里我们称之为属性(特征即是属性:类似于 洗衣机的宽高)。
-
行为就是一个函数,在类里我们称之为方法(行为即是方法:类似于 洗衣机的功能)。
-
类其实就是由 属性 和 方法 组成的一个抽象概念。
属性 和 方法 是抽象来的。 是你观察,发现的相同点。可以说 : 属性与方法被类 封装起来了/保护起来了。(在python中 缩进代表着 包含的意思)
总结:
-
类属对象的抽象出来的
-
对象是类的实例出来的
-
万物皆对象 物 --->>> 实实在在的物体
-
对象(拥有属性和方法的集合体)
对象
什么是对象:
对象是由类实例化出来真实存在的事物,可以直接使用。例如:图纸造出飞机 电视 洗衣机...
由那一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。
类和对象的关系:
用类去创建一个对象 , 可以把创建称之为实例化 亦可以用类去实例化一个对象。
-
类是模板,对象是根据类这个模板创建的,应该先有类,再有对象。
-
使用同一个类,能够创建出n多个对象。要符合 is a 的关系。
-
类中定义了什么属性和方法,对象中就有什么属性和方法。
-
不同对象对应的属性值也会不同。
类的设计
在程序开发中,要设计一个类,通常需要满足一下三个要素:
-
类名: 这类事物的名字,安照大驼峰命名法(每个单词的首字母大写)起名。
-
属性: 这类事物具有什么样的特征。== 属性
-
方法: 这类事物具有什么样的行为。== 函数
定义类名
名词提炼法:分析整个业务流程,出现的名词,通常就是找到的类。(可以两个名词拼接成的缩写)
注意:类名要满足标识符命名规则,同事要遵守大驼峰的命名习惯。(首字母大写)
属性和方法的确定
对象的特征描述,可以定义成属性
对象具有的行为(动词)可以定义成方法
练习需求1:
-
小明今年18 岁,身高 1.75,每天早上跑完步,会去 吃 东西
-
小美今年17 岁,身高 1.65,小美不跑步,小美喜欢 吃 东西
class Person(object):
""" 这是一个人类 """
# 类属性
name = ''
age = '12'
height = '1.0'
# 功能函数
def run(self):
# 判断
if == '小明':
print('每天每天早上跑完步,会去 吃 东西')
elif == '小美':
print('小美不跑步,小美喜欢 吃 东西')
def showInfo(self):
print(f'{}\t今年:{}\t身高:{}')
# 拦截 测试
if __name__ == '__main__':
ming = Person()
= '小明'
()
()
面向对象基本语法
在Python中,对象几乎是无处不在的,一切接对象 ;使用dir
内置函数来查看这个对象里的方法。
在python 处处皆对象。
# 可以使用`dir`内置函数来查看这个对象里的方法。
a = []
print(dir(a)) # ['__add__', '__class__', '__class_getitem__'....
定义简单的类(只包含方法)
面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象,
对象名.方法/属性名 可以直接调用这些方法了!
什么是封装?
将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口
对外隐藏内部实现细节,并提供访问的接口
什么时候应该封装?
当有一些数据不希望外界可以直接修改时
当有一些函数不希望给外界使用时
为什么需要封装 ?
1.为了保证 关键数据的安全性
2.对外部隐藏实现细节,隔离复杂度
定义类
手动添加属性 :对象名.属性名 = 赋值
获取 :类外面获取属性 print(对象名.属性名) 可以访问到值
类里面获取对象属性:self.属性名 = (属性名的值)
object -- 默认状态下 ,类不去继承自己书写得类 ,默认继承所有类的*类,就是object(父类,基类)
定义类中的方法
定义函数不要重名 一旦重名 调用的是最后一个(替换) ,也不要和类名重名。 命名规则 首字母小写其余单词首字母大写
# 方法里的第一个参数必须是self 、类名要遵守大驼峰命名法
class 类名(object):
def 方法1(self,参数列表):
pass
def 方法2(self,参数列表):
pass
class Dog(object):
""" 这是一个狗类 """
def run(self):
print(f'{}在奔跑')
def set(self):
print('狗狗在吃东西')
def playPan(self):
print('狗狗在玩耍')
if __name__ == '__main__':
xiaoHang = Dog() # 创建新对象 就会开辟新空间
'''
Python语法特点:
脚本语言 解释性语言 可以动态给对象添加属性
给对象添加属性 是添加到了某一个对象身上并不会影响其他对象和类模板
'''
# 类外面添加属性 对象名.属性名 = 赋值
= '小黄'
()
xiaoHen = Dog() # 创建新对象 就会开辟新空间
= '小黑'
()
print(xiaoHen == xiaoHang)
print(id(xiaoHen))
print(id(xiaoHang))
创建对象:
对象 又叫 实例(先有类 在创建对象)
对象名 = 类名() # 类名() 等号赋值到 对象变量名 (变量名即使对象名)
例子:
第一个面向对象代码
需求
-
小猫 爱 吃 鱼,小猫 要 喝 水
分析
-
定义一个猫类 Cat
-
定义两个方法 eat 和 drink
-
按照需求 —— 不需要定义属性
class Cat:
"""这是个猫类"""
def eat(self):
print("小猫在吃东西")
def drink(self):
print("小猫在喝水")
tom = Cat() # 创建了一个Cat对象 开辟新空间
()
()
print(id(tom))
hello_kitty = Cat() # 又创建了一个新的Cat对象 开辟新空间
hello_kitty.eat()
hello_kitty.drink()
print(id(hello_kitty)) # 查看内存地址 id()将空间地址数值化
self的使用
给对象添加属性:python 是脚本语言.python支持动态属性,当一个对象创建好了以后,直接使用 对象.属性名 = 属性值
就可以很方便的给对象添加一个属性。(不建议使用这种方式给对象添加属性)
# 这种方法很方便,但是,不建议使用这种方式给对象添加属性。
tom = Cat()
= 'Tom' # 可以直接给 tom 对象添加一个 name 属性
self的概念
self 表示 本身,作为函数的第一个参数,python语法默认提供 ,代表 当前调用此函数的对象。
对象为:return.__new__(cls) 开辟的空间
哪个对象调用了方法,方法里的self指的就是谁。
通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。
class Cat:
"""这是个猫类"""
'''
self 代表调用这个函数的对象
没有定义属性值 ,通过self . 的形式调用这个对象的属性和函数
'''
def eat(self):
print("小猫{}在吃东西".format())
() # 使用self.方法名打印(drink内的方法内容)
def drink(self):
print("小猫在喝水")
print(' ', __name__)
if __name__ == '__main__':
tom = Cat() # 创建了一个Cat对象
='汤姆'
()
print()
print(id(tom))
kt = Cat()
="花花"
print()
()
这种方法很方便,但是,不建议使用这种方式给对象添加属性。
顺序掌握不好会报错 要注意先后顺序 (先定义属性,在调用)
"""
self是调用概函数的对象,打印对象内存地址,与打印self内存地址相同。
那个象调用了 washer方法 就会把 pi对象属性传入self 里面去
一个类 可以创建多个对象, 多个对象都调用方法函数(内存地址不同的)
创建一个对象调用方法 就会开辟新的空间
"""