类
首次发布时间:2020/8/4
最后修改时间:2020/8/4
本系列文章基于 python3 版本
摘要
- 面向对象
- 类
- 类的构成
- 定义一个类
- 创建对象
- self
- 初始化方法
面向对象
-
说到类,必须要提到面向对象编程
-
在函数之前的学习都是面向过程的
- 这一步做什么,下一步做什么,顺序执行,一直到执行结束
-
假设想要喝鱼汤,以面向过程来说就是:
- 买鱼
- 杀鱼
- 把鱼煎一下
- 放调料
- 放水
- 开火烧开
- 喝鱼汤
-
以面向对象的方式就是:
-
找个饭店
-
付钱
-
喝鱼汤
小结
-
面向过程:根据业务逻辑,从上到下编写代码
-
面向对象:将数据与函数绑定到一起,封装成类,用的时候创建相应的对象,可以减少重复代码的编写
-
不论是面向过程还是面向对象,都是一种解决问题的思路
- 就像常说 c++ 是支持面向对象的语言,但是你当然也可以用 c++ 写出面向过程的代码
- 这取决于你的思路
-
面向对象中有 2 个非常重要的概念:类 和 对象
- 对象是面向对象编程的核心
- 在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类
类
- 类都是抽象的
- 如果要问什么是狗时,那肯定会说:
- 有四肢
- 有两个耳朵
- 有尾巴
- 叫声:汪汪~~
- 会摇尾巴
- 这是狗的共同特征和行为
- 通过将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念————类
- 而对象,在这个例子中就是真实存在的某一只狗
- 它符合类所描述的基本特征,但同时它又是唯一的、具体的
类的构成
- 类(class)由三部分构成:
- 类的名称:类名【遵循大驼峰命名方法】
- 类的属性:一组变量【数据】
- 类的方法:一组函数操作【行为】
- 对应例子:
- 类的名称:狗
- 类的属性:毛色、大小、品种
- 类的方法:会跑、会叫、会吃东西
定义一个类
class 类名:
方法
- 定义一个狗的类
class Dog(object):
def base_info(self):
print('四肢')
print('尾巴')
print('两个耳朵')
print('叫声:汪汪~~')
print('会摇尾巴')
def run(self):
print('奔跑')
创建对象
- 格式:
对象名 = 类名()
- 示例:
class Dog(object):
def base_info(self):
print('四肢')
print('尾巴')
print('两个耳朵')
print('叫声:汪汪~~')
print('会摇尾巴')
def run(self):
print('奔跑')
dog = Dog()
dog.color = 'yellow' # 添加毛色属性
dog.speed = 10 # 添加速度属性
dog.run() # 调用方法,奔跑
- 输出结果:
奔跑
小结
- 创建对象,其实就像用一个模型,生产一个具体的物品
- 类就是模型,对象就是具体的物品
self
- self,可以理解为对象自身
- 当某个对象调用其方法时,Python 解释器会自动把这个对象作为第一个参数传递给 self
- 所以开发者只需要传递 self 后面的参数即可(没有的话就什么都不用传了)
初始化方法
class 类名():
# 初始化函数,用来完成一些默认的设定
def __init__(): # 这个就是 Python 类的构造函数
- 定义一个狗的类:
class Dog(object):
def __init__(self):
self.leg = 4
self.tail = 1
self.ear = 2
self.voice = '汪汪~~'
def base_info(self):
print('四肢')
print('尾巴')
print('两个耳朵')
print('叫声:汪汪~~')
print('会摇尾巴')
def run(self):
print('奔跑')
# 创建狗的对象
dog = Dog()
print('狗有 {} 条腿'.format(dog.leg))
print('狗有 {} 条尾巴'.format(dog.tail))
print('狗有 {} 个耳朵'.format(dog.ear))
print('狗的叫声是:{}'.format(dog.voice))
- 输出结果:
狗有 4 条腿
狗有 1 条尾巴
狗有 2 个耳朵
狗的叫声是:汪汪~~
总结
- 从上面的例子看创建了 Dog 对象后,并没有调用 init() 方法
- 但是 leg、tail、ear、voice 等属性就有了
- 这是因为创建对象的时候,构造函数 init() 就自动被调用了
思考一下
- 如何给构造函数
__init__()
传递参数呢?
class Dog(object):
def __init__(self, curTail, curVoice):
self.tail = curTail
self.voice = curVoice
def base_info(self):
print('四肢')
print('尾巴')
print('两个耳朵')
print('叫声:汪汪~~')
print('会摇尾巴')
def run(self):
print('奔跑')
dog = Dog(1, '汪汪~~~')
print('狗有 {} 条尾巴'.format(dog.tail))
print('狗的叫声是:{}'.format(dog.voice))
- 输出结果:
狗有 1 条尾巴
狗的叫声是:汪汪~~~
- 小结:
- 在创建一个对象时会默认调用
__init__()
方法 __init__(self)
中,默认有 **1 **个参数名字为 self- 如果在创建对象时需要传递 2 个实参
- 那么
__init__(self)
中除了 self 作为第 1 个形参外,还需要 2 个形参 - 例如
__init__(self, x, y)
- 在创建一个对象时会默认调用
__init__(self)
中的 self 参数,不需要开发者传递,python 解释器会自动把当前的对象的引用传递进去- 类里面的其它方法也一样,不需要开发者传递 self
- 在 python 中方法名如果是
__xxxx__()
的,那么都是有特殊功能的,因此叫做 "魔法方法"