Python类¶
Python程序中类的使用顺序是这样的:
- 定义类
- 创建类的实例(对象)
定义类¶
在Python中, 使用关键字class定义类, 基本的语法格式如下:
class 类名:
多个(>=0)类属性...
多个(>=0)类方法...
无论是类属性还是类方法, 对于类来说, 它们都不是必需的, 可以有也可以没有. 另外, Python类中属性和方法所在的位置也是任意的, 即它们之间并没有固定的前后次序.
类属性就是类中的变量, 类方法就是类中的函数. 换句话说, 类属性和类方法其实分别是包含在类中的变量和函数的别称. 需要注意的一点是, 同属一个类的所有类属性和类方法, 要保持统一的缩进格式(通常是4空格缩进).
Python类是由类头(class 类名)和类体(统一缩进的变量和函数)构成.
和函数一样, 也可以为类定义文档字符串,其要放在类头之后, 类体之前的位置.
__init__()方法¶
在创建类时, 可以手动添加一个__init__()方法, 该方法是一个特殊的类方法, 称为构造方法(或构造函数).
构造方法用于创建对象时使用, 每当创建一个对象时, Python解释器都会自动调用它. 在Python类中, 定义构造方法的语法格式如下:
def __init__(self, ...):
code-block
__init__()方法可以包含多个参数, 但必须包含一个名为self的参数, 且必须作为第一个参数.
如果没有定义构造方法, Python会自动为类添加一个仅包含self参数的空的构造方法, 作为默认构造方法.
注解
在Python中, 以双下划线开头和结尾的方法, 都具有特殊意义.
创建对象¶
创建对象的过程, 又称为类的实例化.
对已定义号的类进行实例化, 其语法格式如下:
类名(参数)
定义类时, 如果没有手动添加__init__()构造方法, 又或者添加的__init__()中仅有一个self参数, 则创建类对象时的参数可以省略不写.
对象的使用¶
总的来说, 实例化后的类对象可以执行以下操作:
- 访问或修改类对象具有的实例变量, 甚至可以添加新的实例变量或删除已有的实例变量;
- 调用类对象的方法, 包括调用现有的方法, 以及给类对象动态添加方法.
- 类对象访问变量或方法
对象名.变量名
对象名.方法名(参数)
- 给类对象动态添加/删除变量
Python支持为已创建好的对象动态增加实例变量, 方法也很简单:
# 赋值即变量定义
对象名.变量名 = value
也可以动态地删除实例变量:
del 对象名.变量名
- 给类对象动态添加方法
Python也允许为对象动态增加方法.
但是需要注意的是, 对于动态增加的方法, Python不会自动将调用者绑定到第一个参数(即使第一个参数命名为self也没用).
在调用动态添加的方法时, 需要手动传递第一个参数.
Example:
class Student:
pass
def SetName(self, name):
self.name = name
student = Student()
# 动态的为对象添加一个方法
student.SetName = SetName
# 调用动态添加的方法时, 需要手动传递一个参数
student.SetName(student, 'hello')
print(student.name)
如果不想手动传递参数, 可以借助types模块中的MethodType实现.
Example:
class Student:
pass
def SetName(self, name):
self.name = name
from types import MethodType
student = Student()
# 使用types模块中的MethodType为对象动态添加一个方法
student.SetName = MethodType(SetName, student)
# 调用动态增加的方法时不用手动传递self
student.SetName('hello')
print(student.name)
当然, 如果动态增加的方法中没有使用self参数, 可以在调用时不传递对象本身.
Example:
class Student:
pass
def Show():
print('hello, world')
student = Student()
student.Show = Show
student.Show()
self参数¶
在定义类的过程中, 无论是显式创建类的构造方法, 还是向类中添加实例方法, 都要求将self参数作为方法的第一个参数.
事实上, Python只是规定, 无论是构造方法还是实例方法, 最少要包含一个参数, 并没有规定该参数的具体名称.
之所以将其命令为self, 只是程序员之间约定成俗的一种习惯, 遵守这个约定, 可以使我们的代码具有更好的可读性(大家一看到self, 就知道它的作用).
注解
Python类方法中的self参数就相当于C++中的this指针.
self参数的具体作用是什么呢?
同一个类可以产生多个对象, 当某个对象调用类方法时, 该对象会把自身的引用作为第一个参数自动传给该方法. 换句话说, Python会自动绑定类方法的第一个参数指向调用该方法的对象. 这样, Python解释器就能知道到底要操作哪个对象的方法了.