面向对象(oop)基本概念
对比面向过程,我们之前的编程方式即为面向过程
1.过程和函数
过程 类似函数,只能执行,无返回值
函数 可执行,也可有返回值
2.面向过程 即怎么做?
把完成某一个需求的所有步骤从头到尾实现;根据需求,将某些功能独立的代码封装为许多函数;最后顺序调用不同函数
特点:注重步骤过程,不注重职责分工;若需求复杂,代码跟着复杂;开发复杂项目,无固定套路则开发难度大
3.面向对象 即谁来做?
相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个办法
步骤:
确定职责 ,要做的事(方法)
根据职责确定不同对象,对象内部封装不同方法
最后,完成代码即顺序的让不同的对象调用不同的方法
特点:
注重对象和职责,不同对象承担不同职责
更加适合对复杂的需求变化,是专门为复杂的项目开发提供的固定套路
需要在面向过程基础上学习些面向对象的语法
类和对象
1.类
是对一群具有相同特征或行为的事物的统称,是抽象的,不能直接使用
特征 ---->属性
行为 ---->方法
(类相当于制造飞机的图纸,是一个模板,负责创建对象)
2.对象
是由类创建出来的一个具体的存在,可以直接使用
由哪个类创建的对象,则拥有类对应的属性和方法
(对象就相当于用图纸制造的飞机)
3.二者关系
先有类,再有对象
类可有一个,对象可有多个
类中定义什么属性和方法,对象中就有什么属性和方法
不同对象之间属性可能会各不相同
类的设计
满足要素:
类名 这类事物的名字,满足大驼峰命名法
属性 该类事物具有特征
方法 该类事物具有行为
定义简单类
面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象就可以直接调用这些方法了
1.定义只包含方法的类
语法
class 类名:
def 方法一(self,参数列表): #定义方法
pass
def 方法二(self,参数列表):
pass
区别在于,第一个参数必须是self
2.创建对象
对象变量=类名()
举例
小狗爱喝水,爱吃骨头
class dog:
def eat(self):
print('小狗爱吃骨头')
def drink(self):
print('小狗爱喝水')
x=dog()
x.eat() #小狗爱吃骨头
x.drink() #小狗爱喝水
3.引用
在python使用类 创建对象之后,x变量中仍然记录的是对象在内存中的地址
即tom变量引用了新建的狗对象
使用print输出对象变量,默认情况下,是能够输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中地址(十六进制表示)
提示:计算机中通常使用十六进制表示内存地址
class dog:
def eat(self):
print('小狗爱吃骨头')
def drink(self):
print('小狗爱喝水')
x=dog()
x.eat() #小狗爱吃骨头
x.drink() #小狗爱喝水
class dog:
def eat(self):
print('小狗爱吃骨头')
def drink(self):
print('小狗爱喝水')
x=dog()
x.eat() #小狗爱吃骨头
x.drink() #小狗爱喝水
print(x) #<__main__.dog object at 0x000002155D3A2FC8>
#dog 类;object 对象名;0x000002155D3A2FC8> 十六进制数字,表示当前创建狗对象在内存中的位置
4.创建多个对象
class dog:
def eat(self):
print('小狗爱吃骨头')
def drink(self):
print('小狗爱喝水')
x=dog()
x.eat() #小狗爱吃骨头
x.drink() #小狗爱喝水
print(x) #<__main__.dog object at 0x000002155D3A2FC8>
addd=id(x)
print("%x" %addd) #167785900c8 十六进制输出
print("%d" %addd) #2620629057992 十进制输出
y=dog()
y.eat() #小狗爱吃骨头
y.drink() #小狗爱喝水
addd=id(y)
print(y) #<__main__.dog object at 0x0000027A91CE0248>
z=y
print(z) #<__main__.dog object at 0x0000015B534F0288> z=y地址
5.给对象增加属性
利用赋值语句,临时增加属性(不推荐)
在python中,给对象设置属性,非常容易大怒不推荐使用,因为对象属性的封装应当封装在类的内部
class dog:
def eat(self):
print('小狗爱吃骨头')
def drink(self):
print('小狗爱喝水')
x=dog()
x.eat() #小狗爱吃骨头
x.drink() #小狗爱喝水
print(x) #<__main__.dog object at 0x000002155D3A2FC8>
x.name='x' #利用赋值语句,临时增加属性