类和对象
面向过程 & 面向对象
都是一种解决问题的思路(思想)
面向过程
在解决问题的时候,关注的是解决问题的每一个的过程(步骤)
面向对象
在解决问题的时候,关注的是解决问题所需要的对象
举个例子:做好饭之后洗碗
- 面向过程 你
- 洗菜
- 点火倒油
- 放菜,材料
- 翻炒
- 盛出
- 放水
- 放碗
- 倒洗洁精
- 开始刷
- 擦干水
- 摆放好
- 面向对象
对比
面向对象和面向过程都是解决问题的一种方式(思想) 面向对象本身是对面向过程的封装.
1> 面向过程编程最重要的是什么?
- 按照步骤划分
把一个任务,分解成具体的每一个步骤
2> 面向对象编程最重要的什么?
- 按照功对象能进行划分
找到对象, 确定对象属性和行为
3> 如何从面向过程编程的思想,过渡到面向对象编程?
- 一样的,列举出一个任务的具体实现步骤
- 试图分离这些实现步骤中的功能代码块
- 将这些功能代码块,划分到某一个对象中
- 根据这个对象以及对应的行为,抽象出对应的类 设计类
类和对象的执行过程
类和对象的存储方式、关系
定义一个类名为Money的类:
- 实际上在内存中分配了一块地方,用来存放类,而类名Money是一个变量,存储在另一块内存中,里面存的是指向类的地址
- 类和对象关系:对象是通过__ class __这个对象属性来访问类的
对象属性存储方式
类属性存储方式
类属性访问方式
1)通过 类名.类属性 访问类属性
2)通过 对象名.类属性 访问类属性
为什么可以通过 对象 访问到类属性?
答: 和Python对象的属性查找机制有关
- 优先到对象自身去查找属性 找到则结束
- 如果没有找到
- 则根据__class__找到对象对应的类
- 到这个类里面查找
类属性内存存储问题 - 一般情况下,属性存储在__dict__的字典当中 有些内置对象没有这个__dict__属性
- 一般对象可以直接修改__dict__属性
- 但类对象的__dict__为只读;默认无法修改 可以通过setattr方法修改
限制对象属性
class Money(object):
# 通过设置类属性__slots__来限制对象的属性
# __slots__这个属性是一个列表,列表中的元素,即为通过这个类创建出的对象可以添加的对象属性
# 如果这个类实例出的对象,添加了非列表之内的属性,则会报错
__slots__ = ['name', 'age']
p1 = Money()
# p1 这个对象只可以添加 age和 name这两个属性
p1.age = 18
p1.name = 'as'
print(p1.age)
print(p1.name)
# 如果这个类实例出的对象,添加了非列表之内的属性,则会报错
p1.num = 222
print(p1.num)
输出结果:
18
as
# 错误信息
Traceback (most recent call last):
File "F:/PycharmProjects/code/限制对象的属性.py", line 19, in <module>
p1.num = 222
AttributeError: 'Money' object has no attribute 'num'