Python 学习笔记
一、什么是面向对象
对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。
emmm,还是看下通俗点的理解吧…
1.1、举例:" 面向对象 " 与 " 面向过程 "
如:把大象放入冰箱
1.面向过程:
打开功能 , 存储功能 , 关闭功能
人.打开 人.存储 人.关闭 (人不仅需要会用这几个功能, 还有知道具体怎么实现功能)
2.面向对象:
# 面向对象的编程思想,将相应的功能统一保存到相应的对象当中
# 这种方式编写的代码,比较容易阅读,并且比较容易维护,容易复用
分析:
(打开, 存储, 关闭)这三个功能, 都属于 "冰箱这一类事物所具备的行为动作"
所以, 只需要创建 "冰箱" 这么一个对象, 就可以完成操作
冰箱.打开 冰箱.存储 冰箱.关闭 (人只需要会用这几个功能就行, 具体实现不用管, 由冰箱自己实现)
再如:
我想吃汉堡, 叫(调用) 某人(对象) 去买(跑腿、支付等功能)
我只是调用一个对象去完成某事, 并不关心其完成的过程, 这就是一个面向对象
1.2、" 面向对象 " 与 " 面向过程 "
-
面向过程:
1. 面向过程就是将程序的逻辑分解成一个一个的步骤;
2. 通过对每个步骤的抽象来完成程序。 -
面向对象:
1. 面向对象是一种思考问题的方式, 面向对象它是一种思想。
2. 面向对象将事务变的简单化。(如在上面的例子, 人 从’执行者’, 变为了’指挥者’)
3. 所谓面向对象的编程语言,简单理解就是语言中所有的操作都是通过对象来完成的。
二、对象(object)
2.1、对象的简介
对象就是内存当中,专门用来存储指定数据的区域 。(可以理解为是一个用来装东西的 " 容器 ")
2.2、对象的结果
每个对象在内存当中要保存 3 种数据:
-
id(标识)
id 是由编译器生成的,在 Cpython 中,id 就是对象的内存地址。对象一旦创建,则 id 无法改变。
通过 id() 函数可以查看对象的 id 。 -
type(类型)
类型就是用来标识当前对象所属的类型。Python 是一门强类型语言,对象一旦创建,则类型无法改变。
通过 type() 函数可以查看对象的类型。 -
value(值)
值就是对象中存储的具体数据。(对象分为两大类:可变对象,不可变对象)
不可变(immutable): int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable): 字典型(dictionary)、列表型(list)
三、类(Class)
3.1、类的简介
- 一般的,我们所使用的一些对象(如,int,str,list,tuple,dict…)这些都是 Python 的内置对象。然而,在开发中往往需要我们自己定义一些对象,这就要通过 类(Class) 来创建。
- 类,简单理解就是相当于一个图纸。前面说过,对象相当于是 " 容器 ",那么这个容器的形状、内部结构等,就是由 类 这张 "图纸 " 来决定。我们也称对象是类的实例 ( instance )
- 如果多个对象是通过一个类创建的,我们称之为这些对象都是一类对象。
- 如果我们要自定义类,一般要使用大写字母开头如:MyClass
# 像 int() float() bool() list()...这些都是类
a = int(10) # 创建一个 int 类的实例 等价于 a = 10
b = str('hello') # 创建一个 str 类的实例
3.2、定义一个类
使用 class 关键字来定义。语法: class 类名([父类]): 代码块
class MyClass():
pass
print(MyClass) # <class '__main__.MyClass'>
3.3、使用类来创建一个对象
使用类来创建对象,就像调用函数一样。
# 定义一个类
class MyClass():
pass
# 使用 MyClass 来创建一个对象
mc = MyClass() # mc 就是通过 MyClass 创建的对象,mc 是 MyClass 的实例
mc_2 = MyClass()
mc_3 = MyClass()
mc_4 = MyClass()
# isinstance() 用来检测一个对象是否是一个类的实例
result = isinstance(mc,MyClass)
result2 = isinstance(mc_4,MyClass)
print(result,result2)
四、对象的创建流程
- 类也是一个对象。类就是用来创造对象的对象。
- 类是 type 类型的对象,定义类实际上就是定义了一个 type 类型的对象。
class MyClass():
pass
print(id(MyClass),type(MyClass))
4.1、创建一个空的对象
class MyClass():
pass
mc = MyClass()
print(mc)
4.2、向空对象中加变量
我们可以向对象当中添加变量,对象中的变量称之为 " 属性 "。语法: 对象.属性名 = 属性值
class MyClass():
pass
mc = MyClass()
mc.name = 'hello'
print(mc.name)
五、类的定义
- 类的定义:类和对象都是现实生活中内容的抽象
- 实际上所有的事物都是由两部分组织(
1. 数据(属性)
2. 行为(方法)
5.1、尝试定义一个人类
class Person():
# 在类的代码块中, 我们可以定义变量
# 在类中我们所定义的变量, 将会成为所以实例的公共属性, 所有实例都可以访问这些变量
name = 'wlx'
# 在类中也可以定义函数,类中定义的函数,我们称之为 "方法"
# 这些方法也可以通过该类的实例来访问
def say_hello():
print('Hello!')
mc = Person()
print(mc.name)
mc.say_hello() # 报错, 下面说
5.2、方便调用 和 函数调用 的区别
调用语法:对象.方法名
- 函数调用,函数有几个形参,则调用函数的时候就要传递几个实参。
- 方法调用,默认传递一个参数,所有方法中至少要定义一个形参。
注意: 方法调用时,第一个参数由解释器自动传递,所以定义方法时,至少要定义一个形参。
第一个参数就是调用方法的本身, 一般我们都会将这个参数命名为 self (当然, 其他名字也行)。
“ 调用方法的本身 ”,意思是:哪个实例调用,self 就是谁
class Person():
# 在类的代码块中, 我们可以定义变量
# 在类中我们所定义的变量, 将会成为所以实例的公共属性, 所有实例都可以访问这些变量
name = 'wlx'
# 在类中也可以定义函数,类中定义的函数,我们称之为 "方法"
# 这些方法也可以通过该类的实例来访问
# 在类中方法不能访问类中的属性 __init__
def say_hello(self):
# 第一个参数就是调用方法的本身, 一般我们都会将这个参数命名为 self (当然, 其他名字也行)
# 如: 是 p1 调用,则第一个参数就是 p1 对象
print('你好!我是 %s'%self.name)
mc = Person()
p1 = Person()
p1.name = 'p1' # 也可以改变对象 p1 的属性值
print(mc.name)
print(p1.name)
mc.say_hello()
5.3、属性和方法
- 1. 当我们调用一个 对象(p1) 的属性(name) 时,解析器会先在 当前对象(p1) 中寻找是否含有该属性;
- 2. 如果有,则直接返回当前对象的属性值;
- 3. 如果没有,则去当前对象的 类对象(Person) 中去寻找,如果有则返回类对象的属性值(wlx);
- 4. 如果没有则报错。
类对象和实例对象都可以保存属性(方法), 那么保存时因如何选择?
- 如果这个属性(方法)是所有实例共享的,则应该将其保存到类对象中
- 如果这个属性(方法)是某个实例独有的,则应该保存到实例对象中