1. 背景知识:类与对象
类是对象的模板,定义了对象的属性和行为;而对象是类的实例,具有具体的数据和状态。类是静态的,只有在创建对象时才会动态生成并占用内存。Python3 self
和 cls 都是类方法中常用的参数,它们分别用于引用实例对象和类本身。虽然它们看起来有点类似,但它们的作用和使用场景是不同的。
2. self 参数的使用
含义:
-
self
是类中实例方法的第一个参数,它指代当前实例化的对象本身。你可以通过self
访问实例的属性和方法。 -
self
不是 Python 关键字,而是约定俗成的命名方式(你可以用其他名字代替self
,但不推荐)。
用法:
-
self
必须在实例方法中作为第一个参数出现。 -
在方法内部,你通过
self
来访问该实例的属性和调用该实例的其他方法。
示例:
class MyClass:
def __init__(self, value): # 构造函数
self.value = value # self.value 指代实例的属性value
def show_value(self): # 实例函数
print(f"The value is: {self.value}") # self 用来访问实例的属性
obj = MyClass(10) # 创建一个实例
obj.show_value() # 调用实例函数
代码的运行结果如下:
The value is: 10
注意事项:self 只会出现在实例方法中,不会出现在类方法或者静态方法中。在调用实例方法时,self 会自动由 Python 解释器传递,而你在调用方法时不需要显式传递它。
3. cls 参数的使用
含义:
-
cls
是类方法的第一个参数,它指代当前类本身(而不是实例)。cls
允许你访问类的属性和方法。 -
类方法是绑定到类上的方法,而不是绑定到某个实例,因此需要使用
cls
来引用类。
用法:
-
cls
必须在类方法中作为第一个参数出现。 -
类方法通过装饰器
@classmethod
来定义。 -
类方法可以访问类的属性和方法,但不能访问实例的属性和方法(除非通过
cls
创建实例)。
示例:
class MyClass:
class_var = 100 # 类属性
def __init__(self, value):
self.value = value # 实例属性
@classmethod
def show_class_var(cls):
print(f"The class variable is: {cls.class_var}") # cls 用来访问类属性
@classmethod
def create_instance(cls, value):
return cls(value) # cls 用来通过类本身创建实例
# 通过类方法访问类变量
MyClass.show_class_var()
# 通过类方法创建实例
new_obj = MyClass.create_instance(200)
print(new_obj.value)
代码的运行结果如下:
# 输出:
The class variable is: 100
200
注意这里类方法 create_instance() 调用了类本身以及其构造函数产生了一个类的实例,并给 value 赋值 200。这个实例名称为 new_obj. 所以 print(new_obj.value) 输出的结果为200。
4. self 与 cls 参数的区别
直接使用表格,简单明了。这里注意 self 只能指代类的一个实例(对象)。cls 指代类本身,所以可以通过 cls 调用类本身的构造函数来初始化一个实例。
特点 | self | cls |
---|---|---|
指代对象 | 实例对象(类的一个具体实例) | 类本身 |
方法类型 | 实例方法(使用 self ) | 类方法(使用 cls ,通过 @classmethod 装饰器) |
访问属性 | 访问实例属性和方法 | 访问类属性和类方法 |
调用方式 | 通过实例调用 | 通过类调用 |
5. self
和 cls
共同使用的情况
在一些场景中,可能会同时使用 self
和 cls
。这种情况通常出现在涉及实例方法和类方法交互的场合,比如通过类方法来创建实例,或者在类方法中操作实例属性。
class MyClass:
class_var = 100 # 类属性
def __init__(self, value):
self.value = value # 实例属性
@classmethod
def create_instance(cls, value):
# 通过 cls 创建实例并修改类属性
instance = cls(value)
cls.class_var = 200 # 修改类属性
return instance
def show_value(self):
print(f"Instance value: {self.value}")
print(f"Class variable: {self.__class__.class_var}")
# 通过类方法创建实例
obj = MyClass.create_instance(10)
# 访问实例和类的属性
obj.show_value()
代码的运行结果如下
# 输出:
Instance value: 10
Class variable: 200
注意这里 __class__
是 Python 中的一个特殊属性,它用于获取实例对象所属的类, 在面向对象编程中有重要作用。所以 self.__class__.class_var 返回的就是 obj 实例的类,也就是 MyClass 的 class_var 属性。
6. 写在最后
self 和 cls 参数在定义类的时候经常使用,但是很多小伙伴对其一知半解,现在明白了吗?
-
self
是实例方法的第一个参数,指代当前对象实例,可以通过它访问实例的属性和方法。 -
cls
是类方法的第一个参数,指代当前类本身,可以通过它访问类的属性和类方法。 -
self
和cls
都是 Python 面向对象编程中的重要概念,帮助区分实例与类的关系。
参考文献