Python 3 中 cls 和 self 参数的使用及注意事项

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 调用类本身的构造函数来初始化一个实例。

特点selfcls
指代对象实例对象(类的一个具体实例)类本身
方法类型实例方法(使用 self类方法(使用 cls,通过 @classmethod 装饰器)
访问属性访问实例属性和方法访问类属性和类方法
调用方式通过实例调用通过类调用
5. selfcls 共同使用的情况

在一些场景中,可能会同时使用 selfcls。这种情况通常出现在涉及实例方法和类方法交互的场合,比如通过类方法来创建实例,或者在类方法中操作实例属性。

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 是类方法的第一个参数,指代当前类本身,可以通过它访问类的属性和类方法。

  • selfcls 都是 Python 面向对象编程中的重要概念,帮助区分实例与类的关系。

参考文献

python中cls和self的不同及使用_python cls和 self-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方博士AI机器人

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值