类就是Class
类的基本
- 类和实体 我们可以简单的将实体(instance)理解成具体的实物对象,把类看作是生产实体的蓝图。比如我们定义一个类
Car
,之后就可以在任何地方反复调用这个蓝图来生产Car
的实体 - 方法 在Python中我们可以像写脚本一样随便写个方法就执行,但是这可能带来诸多麻烦。比如我们为汽车的启动和停止写了两个方法
run()
和stop()
,为了确定让哪辆车启动哪辆车停下,我们需要把对象的车多为参数传递进方法,是不是有一种拿遥控器开车还要每次都设置开的哪辆车的感觉? 当我们需要在不同的地方使用这两个方法时,就要重新写一遍。如果我们把run()
和stop()
写到类Car
里面,就可以通过每个Car
的实体,直接调用启动和停止的方法,方法属于车的实体,不同实体间的启动停止互不影响,这就有开车那味儿了。 - 成员变量 类的成员变量分为两种(此处为Java思维):静态变量和实例变量。 所谓静态变量,我们可以理解成刻在蓝图里的,比如我们给
Car
定义一个静态变量轮子数 = 4
,这样我们生成的每个车都可以使用这个变量,甚至不生成实例的时候,也可以使用Car.轮子数
, 只要看一下蓝图,就知道这个变量值。相比之下,实例变量就是指从属于实例的变量,比如排气量 长度 宽度
,如果要调用这些变量,直接通过Car.排气量
是不行的,因为图纸上可没具体写这变量是多少,需要先生成一个实体my_car = Car()
,然后给my_car
设置并使用
Python中类的使用
类的定义
Python中定义类使用的是关键字class
,类的范围通过统一的缩进来管理1
2
3
4
5
6
7
8
9
10class Car:
id = 12345
def __init__(self, id):
self.id = id
def run(self):
print(f'run {self.id}!')
类的内部使用关键字def
来定义方法,方法必须至少有一个参数self
,self
的含义相当于Java的this
,指的是类的实例,可以通过self
来访问实例变量和方法。
__init__
是构造体,当我们使用类名来生成实例的时候,会根据参数来调用对应的构造体生成实例,最基本的写法就是直接通过构造体给实例变量初始化,比如使用上面代码里得构造体:Car(54321)
。
Python中使用__
双下划线来定义私有变量和私有方法,私有的元素无法在外部通过实例名或者类名访问到
就像Java中所有的类都是Object的字类,都继承了一些基本的方法一样,Python中也有一些类的专有方法, 且可以重写:
- init : 构造函数,在生成对象时调用
- del : 析构函数,释放对象时使用
- repr : 打印,转换
- setitem : 按照索引赋值
- getitem: 按照索引获取值
- len: 获得长度
- cmp: 比较运算
- call: 函数调用
- add: 加运算
- sub: 减运算
- mul: 乘运算
- truediv: 除运算
- mod: 求余运算
- pow: 乘方
后记
跟同事聊了聊为什么要使用类,想起了一个很重要的点:内存管理。
如果我们不适用类来管理方法和变量的话,程序运行过程中,定义的变量和方法就会一直存在,占用内存空间;但是当我们使用了类之后,则可以在需要的时候声明类的实例来调用内存,当一个实例不再被使用的时候,又可以通过垃圾回收自动收回内存(垃圾回收机制不同语言有不同的做法)。这样我们的程序才可以根据需求灵活地使用资源。
当然,方法和变量的管理更方便什么的,也算使用类的好处