我们之前学习的编程方式就是面向过程的
面向过程和面向对象,是两种不同的编程方式
对比面向过程的特点,可以更好地了解什么是面向对象
特点
相比较函数,面向对象 是 更大 的 封装,根据 职责 在 一个对象中 封装 多个方法
在完成某一个需求前,首先确定 职责 —— 要做的事情(方法)
根据 职责 确定不同的 对象,在 对象 内部封装不同的 方法(多个)
最后完成的代码,就是顺序地让 不同的对象 调用 不同的方法
特点
类 和 对象 是 面向对象编程的 两个 核心概念
在程序开发中,应该 先有类,再有对象
对象是类具体化的结果
在使用面相对象开发前,应该首先分析需求,确定一下,程序中需要包含哪些类!
在程序开发中,要设计一个类,通常需要满足一下三个要素:
CapWords
名词提炼法 分析 整个业务流程,出现的 名词,通常就是找到的类
对 对象的特征描述,通常可以定义成 属性(类的本身所具有的特性,叫做属性)
对象具有的行为(动词),通常可以定义成 方法(用类去定义的的对象所具备的可操作的能力叫做方法)
提示:需求中没有涉及的属性或者方法在设计类时,不需要考虑
需求
小明 今年 18 岁,身高 1.75,每天早上 跑 完步,会去 吃 东西
小美 今年 17 岁,身高 1.65,小美不跑步,小美喜欢 吃 东西
class Human:
"""
此类主要是构建人类
"""
mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
dic = {}
l1 = []
def work(self): # 第二部分:方法 函数 动态属性
print('人类会工作')
class 是关键字与def用法相同,定义一个类。
Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
类的结构从大方向来说就分为两部分:
查看类中的所有内容:类名.dict方式。
class Human:
mind = '有思想'
dic = {}
l1 = []
def work(self):
print('会工作')
print(Human.__dict__)
print(Human.__dict__['mind'])
Human.__dict__['mind'] = '高智慧'
print(Human.__dict__)
# 通过这种方式只能查询,不能增删改
万能的点.
class Human:
mind = '有思想'
dic = {}
l1 = []
def work(self):
print('会工作')
print(Human.mind)
Human.mind = '高智慧'
print(Human.mind)
del Human.mind
print(Human.mind)
Human.walk = '用脚走'
print(Human.walk)
# 通过万能的点 可以增删改查类中的单个属性
对以上两种做一个总结:如果想查询类中的所有内容,通过 第一种dict方法,如果只是操作单个属性则 用万能的点的方式。
class Human:
mind = '有思想'
dic = {}
l1 = []
def work(self):
print(self,'会工作')
Human.work('chensong')
Human.__dict__['work']('chensong')
对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象。
class Human:
mind = '有思想'
dic = {}
l1 = []
def work(self):
print(self,'会工作')
human1 = Human()
# 只要实例化对象,它会自动执行__init__方法
print(human1)
其实实例化一个对象总共发生了三件事:
class Human:
mind = '有思想'
walk = '用两只腿走'
def __init__(self,name,sex,age,hobby):
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('chensong','男','18','男')
对象查询对象中所有属性。 对象.__dict__
class Human:
mind = '有思想'
language = '实用语言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('chensong','男',18,'男')
print(obj.__dict__)
对象操作对象中的单个属性。 万能的点.
class Human:
mind = '有思想'
language = '实用语言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('chensong','男',18,'男')
# 添加属性
obj.job = 'IT'
# 删除属性
del obj.n
# 修改属性
obj.s = '女'
print(obj.s)
# 查看属性
print(obj.__dict__)
class Human:
mind = '有思想'
language = '实用语言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('chensong','男',18,'男')
print(obj.mind)
print(obj.language)
obj.a = 666
print(obj.a)
类中的方法一般都是通过对象执行的(出去类方法,静态方法外),并且对象执行这些方法都会自动将 对象空间传给方法中的第一个参数self.
self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给 self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象。
一个类可以实例化多个对象
序号 | 方法名 | 类型 | 作用 |
---|---|---|---|
01 | __new__ | 方法 | 创建对象时,会被 自动 调用 |
02 | __init__ | 方法 | 对象被初始化时,会被 自动 调用 |
03 | __del__ | 方法 | 对象被从内存中销毁前,会被 自动 调用 |
04 | __str__ | 方法 | 返回对象的描述信息, print 函数输出使用 |
05 | __dir__ | 方法 | 查看对象内的所有属性以及方法 |