类方法/类函数第一个参数为什么是“self”?

本文详细解释了类方法的概念及其实现原理,介绍了类变量与实例变量的区别,并通过实例演示了两者如何在类中工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类方法是对类中定义的函数的称呼,有别于一般函数的是,它的第一个参数是固定的,表示类实例化后实例本身。
为什么类方法的第一个参数必须为指代实例本身的参数?
这里要介绍一下类中的变量类型
类中的变量有两种类型:类变量实例变量
类变量
在类方法外,命名方式和普通变量一样,在类方法内使用 “类.变量” 的方式表示。
实例变量
带有 “self” 前缀的即为 实例变量 。因为它要带有 “self” 前缀,所以它必定位于类方法内。

实例变量 是类实例化后拥有的变量,适用范围只限于一个实例内,多个实例不共享。
类变量 的使用不需要类实例化,且类实例化后,多个实例共享类变量。

先看类变量 的使用不需要类实例化
定义,__init__函数是内置方法,效果是运行类后自动运行其函数,不用像别的函数那样 显式调用
显示调用:若要使用A中foo的方法必须a.foo(),其中a.foo()为显示调用

class A(object):
    class_var = 0
    def __init__(self):
        A.class_var += 1
    def foo(self):
        print("Axxx.class_var is {}".format(id(A.class_var)))
        print("self.class_var is {}".format(id(self.class_var)))
    def bar(self):
        print("Total is {}".format(A.class_var))
        print("self is {}".format(self.class_var))
a=A()

运行

A
a.bar()

结果是

Total is 1
self is 1

可以看到 类变量 使用不需要类实例化,并且被实例化后的实例共享

类变量 在与 实例变量 值不同前,其id与 实例变量 保持一致,即共享同一个存储单元
运行

a.foo()

结果

Axxx.class_var is 140726138671968
self.class_var is 140726138671968

再次验证

class A(object):
    class_var = 0
    def __init__(self):
        A.class_var += 1
        self.class_var += 1
    def foo(self):
        print("Axxx.class_var is {}".format(id(A.class_var)))
        print("self.class_var is {}".format(id(self.class_var)))
    def bar(self):
        print("Total is {}".format(A.class_var))
        print("self is {}".format(self.class_var))
a=A()
a.foo()
a.bar()
Axxx.class_var is 140726138671936
self.class_var is 140726138671968
Total is 1
self is 2

实例变量 值被加了两次,然后我们调换A.class_var += 1 和 self.class_var += 1 位置

class A(object):
    class_var = 0
    def __init__(self):
        self.class_var += 1
        A.class_var += 1
    def foo(self):
        print("Axxx.class_var is {}".format(id(A.class_var)))
        print("self.class_var is {}".format(id(self.class_var)))
    def bar(self):
        print("Total is {}".format(A.class_var))
        print("self is {}".format(self.class_var))
a=A()
a.foo()
a.bar()

结果是

Axxx.class_var is 140726138671936
self.class_var is 140726138671936
Total is 1
self is 1

实例变量 值被加了一次,与类变量 的值保持不变,所以它们的id也相同。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值