Python面试高频问题:类方法中的参数self到底是什么?

本文旨在以最简单的角度叙述,一些情况并未列举。

首先,我们要知道一个类方法是服务于每一个实例化的实例。那从底层来讲,既然是服务于实例的,那实例肯定是要在类方法里面被操作,经过验证,在类方法中的参数self实际上就是这个实例本身。

可以用这样一个简单的方法验证:

class Car:
    def print_info(self):
        # 打印self
        print(self)

# 实例化Car类并调用方法打印出类中的self
car = Car()
car.print_info()
# 打印出实例化的实例
print(car)

这样运行后结果是这样的:

<__main__.Car object at 0x7f77d07eb610>
<__main__.Car object at 0x7f77d07eb610>

Process finished with exit code 0

我们发现打印出来的两个内存地址都是一样的,全部指向Car object也就是Car类的实例。

另外,实际上这个参数的名字是可以自定义的,不过我们约定俗成都会写self,只要是类方法参数的第一个就是实例本身。

class Car:
    def print_info(this):
        # 打印this
        print(this)

# 实例化Car类并调用方法打印出类中的this
car = Car()
car.print_info()
# 打印出实例化的实例
print(car)

结果仍然完全一致。

那么如果在类中要定义并使用跟实例没有关系的静态方法呢?用到@staticmethod即可,第一个参数不再是实例,即使你写的仍然是self。

class Car:
    def print_info(self):
        # 打印self
        print(self)

    @ staticmethod
    def print_info_2(self):
        print(self)

# 实例化Car类并调用静态方法
car = Car()
car.print_info_2('第一个形参需要被穿参,否则报错')
# 打印出实例化的实例
print(car)

运行结果:

第一个形参需要被穿参,否则报错
<__main__.Car object at 0x7fa62097b610>

Process finished with exit code 0

总结下来,self就是这个实例本身,包括一些其他魔术方法比如__init__等都同理,名称也不固定,类方法的第一个形参即是。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值