[ Python ]详解 Python 中 self 的用法

面向对象是 Python 的特色,也是 Python 学习中的重点; 在OOP(面向对象)编程中,有两个重要的概念: 类( class ) 和 实例( instance ):

#!/usr/bin/python3
#-*- coding: utf-8 -*-

class Philosopher:
    def __init__(self, name, gender, sayings):
        self.name = name
        self.gender = gender
        self.sayings = sayings
    
    def gengyishi(self):
        print(self.name + self.gender + ":"  + self.sayings + self.gender)
        print(self.__class__)


van = Philosopher( "VAN" , "♂ " , "乖♂乖♂站♂好" )
van.gengyishi()

源码及执行结果

如上图所示, Philosopher 就是我们定义的一个类,van 就是这个类的一个实例, __ __init____() 就是这个类的构造方法,即实例化这个类时会执行的函数;

在上述例子中,self 必须是 __ init__() 的第一个参数,但它可以改成其他的名字,就比如叫 bili :
#!/usr/bin/python3
#-*- coding: utf-8 -*-

class Philosopher:
    def __init__(bili, name, gender, sayings):
        bili.name = name
        bili.gender = gender
        bili.sayings = sayings
    
    def gengyishi(bili):
        print(bili.name + bili.gender + ":"  + bili.sayings + bili.gender)
        print(bili.__class__)


van = Philosopher( "VAN" , "♂ " , "乖♂乖♂站♂好" )
van.gengyishi()

结果:

VAN♂ :乖♂乖♂站♂好♂ 
<class '__main__.Philosopher'>

可见,改动后,执行的结果没有任何区别;

但还是建议大家遵守代码规范,使用 self 以增强代码的可读性;

_____________________________________________________________________

倘若我们想将 VAN 的 gender 变成一个私有变量,那可以在 它前面加上 __

如:把 self.gender 变成 self.__gender ,这样它就对类的外部不可见了,如果强行调用,会出现:
AttributeError: 'Philosopher' object has no attribute '__gender'

_____________________________________________________________________

self代表的是类的实例(instance), 而不是这个类
#!/usr/bin/python3
#-*- coding: utf-8 -*-

class Philosopher:
    def __init__(self, name, gender, sayings):
        self.name = name
        self.gender = gender
        self.sayings = sayings
        print(self)
        print(self.__class__)

    def gengyishi(self):
        print(self.name + self.gender + ":"  + self.sayings + self.gender)


van = Philosopher( "VAN" , "♂ " , "乖♂乖♂站♂好" )
van.gengyishi()
bili = Philosopher( "Billy" , "♂ " , "folkq" )
bili.gengyishi()

输出结果(注意,van和bili 的self地址不同):

<__main__.Philosopher object at 0x7f9da597e6a0>
<class '__main__.Philosopher'>
VAN♂ :乖♂乖♂站♂好♂ 
<__main__.Philosopher object at 0x7f9da597e6d8>
<class '__main__.Philosopher'>
Billy♂ :folkq♂ 

_____________________________________________________________________

以上所有代码都在"Python 3.7.3"中成功解释执行;

_____________________________________________________________________

参考:https://www.cnblogs.com/wind-wang/p/5768000.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值