# 类和对象
万物皆对象,无处不对象
变量是对象,函数是对象
~~~
### 面向对象的思想
思想(不存在的---抽象的---理解)
(非结构化编程---结构化编程)---面向过程的思想(以过程为核心---只考虑过程)
第一个面向对象的语言:smalltalk
面向对象的革命:Java
C:纯面向过程的语言---C++:拥有面向对象思想的面向过程的语言
python:纯面向对象的语言
OOP:面向对象编程
### 对象
对象 :来自生活(现实世界)----一切客观存在的事物(看得见,摸得到)
电脑,水,空气,人,地球
* 对象的构成
1. 属性:
有什么
2. 方法:
能干什么
对象=属性+方法
* 属性
1. 属性可以又是一个对象
* 方法
1. 可以被别的对象调用
2. 可以被自己调用
* 客观世界由对象组成
1. 大对象是由小对象组成
2. 对象和对象之间彼此方法相互调用
* 如何建立解题思路
例如:北京--->世界杯(俄罗斯)
面向过程:
1. 出行方式
火车---买票+护照+方向+维修+乘务员+吃喝+休息+充电+安全+高原反应+其他
飞机---买票+护照+航向+维修+服务+机长+天气+降落+紧急情况+接机
步行---吃喝拉撒+鞋+钱+安全+其他
轿车---路线+加油站+护照+吃饭+住宿+维修+身体+其他
面向对象:
1. 找对象:
飞机
2. 找方法:
交通运输(机票,护照)
找对象+找方法
* 解决客观问题
1. 找对象
把合适的对象准备好
2. 找方法
对象之间合理配合
* 小结
1. 面向过程的编程思想:把每一步都细化到十分精致(精益求精),只考虑过程
2. 面向对象的编程思想:找到合适的对象,调用合适的方法
## 面向对象在计算机中的使用
计算机解决的需求---来源现实世界
把客观世界的需求,用计算机来实现
1. 面向对象的核心:
计算机模拟现实世界,从而解决现实世界的问题
沟通:语言,文字(飞鸽传书,镖局)信号(狼烟)
沟通需求:邮局:信件---BB机---电脑(电子邮箱)---软件(QQ,wechat,飞秋)
购买需求:原始时期:以物换物---贝壳(纸币,硬币---虚拟货币---价值符号)---商业---购买需求:
吃+喝+玩+学+看+听---硬需---服务(第三产业):外卖+餐饮+中介+旅游+娱乐+物业+电信---软件(美团+淘宝+滴滴+携程+短租)
* 计算机中的对象
~~~markdown
抽象:
计算机中的对象存储在内存中(属性+方法---数据)----模拟对应的对象
现实世界:
学生:
属性:姓名(小明)+年龄(18)+性别(男)+学号(007)
方法:学习+沟通+吃饭+睡觉
计算机世界:
学生:
属性:name='小明'+age=18 + sex='male' + ID=007
方法:def learn()+def community()+def eat()+def sleep()
* 小结
1. 面向对象思想的核心:
模拟现实世界从而解决现实世界的问题
2. 使用面向对象的思想解题
题目:来自于现实世界
现实世界怎么做,计算机就怎么做
3. 面向对象的特性(纲领)
1. 各司其职
2. 弱耦合性
3. 可重用性
4. 可扩展性
OOP:Object Oriented Programming:面向对象的编程
OOD:Object Oriented Design:面向对象的设计
OOA:Object Oriented Analysis:面向对象分析
~~~
---
### 类
1. 类是抽象的,是对象共性的抽取
类是对象的抽象,对象是类的具象
2. 是客观世界在人脑中的一种反应
3. 是对象的模板
(汽车图纸(数据)---汽车)
狗类(抽象)---京巴---金毛---藏獒---毛+4条退+尾巴+汪汪叫+动+跑+吃+睡觉
猫类(抽象)---英短---加菲---折耳---毛+4条退+尾巴+喵喵叫+动+跑+吃+睡觉
鱼类(抽象)---带鱼---鲨鱼---鲤鱼---腮+尾巴+动+游+吃+睡觉
动物类(抽象)---动+吃+睡觉
~~~
* 如何编写一个类
~~~markdown
类是对象的模板
对象=属性+方法
类---属性+方法
~~~
~~~python
# 类---属性+方法-----类-创建对象
class Student:
#属性
name='小明'
age=18
sex='male'
id='007'
#方法
def learn(self):
print('l love learn')
def eat(self):
print('I can eat')
def sleep(self):
print('I want sleep')
s=Student()
print(s.name)
print(s.age)
print(s.sex)
s.eat()
1. 属性分类:(属性---变量)
类属性:定义在类之内任何方法之外的变量
实例属性:定义在方法之内的属性
2. 实例:通过类所创建出来的对象
3. 访问:使用 . 的形式进行调用
4. 类属性:
1. 有且只有一份
2. 用实例.属性名方式修改,创建了一个同名的实例属性(汽车的改装)
3. 类属性可以通过类名直接调用
类属性属于全类共有
4. 类属性,对象创建出来后,可以直接使用
5. 类属性和实例没有必然联系(类属性的创建和实例无关)
6. 作用范围:全类
5. 实例属性:
1. self.属性名创建
2. 对象创建出来之后,还没有创建,只有调用了包含该实例属性的方法之后,才能使用
3. 归实例所有
4. 作用范围:全类
6. 小结
实例属性:只有创建了实例之后才能使用
类属性:只要有类就能调用
* 实例属性和类属性
1. 类属性:
有且只有一份,牵一发而动全局,
2. 实例属性:
实例属性每个实例各自拥有,相互独立,互不干涉
* 方法
类比于函数
1. 方法的声明:能做什么
2. 方法的实现:怎么做
3. self:
1. self指代是当前对象(谁调用方法谁就是当前对象)
2. self变量名可以修改(本质上只是一个位置参数)
3. self被传递进来的是外面的对象的地址(引用)
4. 实例调用方法,系统会自动传递当前对象
5. 类名.调用方法,系统不会传递当前对象(手工传递)
~~~
---
### 构造方法
~~~markdown
1. __init__(self):
初始化方法/构造方法
在创建对象时自动调用,不需要手工调用
2. __init__(self,param1,param2...)
构造方法可以有多个参数,使用逗号隔开
3. 如果一个类中没有任何构造,系统会自动调用父类的构造方法
4. 类中可以写多个构造方法,但是只会执行最后一个构造方法
方法相同,覆盖掉前面的同名方法
5. 构造方法有返回值,返回值必须是None
~~~
* 创建对象
~~~markdown
1. 创建对象
1. 变量名=类名(构造参数)
2. 类名(构造参数) ----也创建了对象(没有引用)
使用一次的时候使用
没有引用的对象--垃圾---回收
2. 创建出的对象:
称之为实例
实例:instance
和实例相关的属性:实例属性
和实例相关的方法:实例方法
* 组合
~~~markdown
大对象是由小对象组成
大对象的属性也是一个对象
1. 如果一个类中的属性是一个对象,则称为组合
~~~
~~~python
class Student:
age=6
class Teacher:
salary=9999999
class School:
s=Student()
t=Teacher()
def getClass(self):
print('学生到校上课,老师到校讲课')
school=School()
school.getClass()
print(school.t.salary)
print(school.s.age)
* 补充
1. 如果实例属性和方法名发生命名冲突,则实力属性执行之后会覆盖掉同名的方法对象
2. 如果类属性和方法名发生命名冲突,则调用名字时会返回方法对象
* 公有私有
1. 在属性名前加两条下划线
private:私有
2. 在属性名前加一条下划线
protected:受保护的
当前文件+其他文件中的子类
3. 私有属性访问范围:本类可以访问
4. 属性私有化+提供对应的get/set方法
给私有化熟悉提供外部访问的接口
5. python为了实现私有化,namemangling的方式进行的私有化
也称之为:名字重构
_类名__类属性名(_类名私有属性名)
python本质并没有将属性私有化,只是改了名字(伪私有化)
* 引用
引用:一个包含了地址的变量
a=10---a是10的引用
1. 如果一个对象没有引用,则会被视为垃圾回收掉
2. 引用的传递
多个变量的首地址通过传递指向同一个对象
牵一发而动全局
a=10
b=a # a将引用传递给了b---a和b指代同一个对象(地址)
self:引用传递
class Dog:
age=4
def hehe(self):
print(self.age) #
black=Dog()
black.age=100
black.hehe()