Python中为什么要用self?

参考文章:
self的含义与基本用法
Python中为什么要使用self

注意到文章中的一句话,避免非限定调用造成的全局变量。
在这里插入图片描述

举个例子来谈谈我对这句话的理解:

class Father():
    def __init__(self,name):
        self.name = name


    def selfDemo(self):
        print('I am Father, My name is %s_%s' % (self.name,self))


class Son1(Father):
    def selfDemo(self):
        print('I am Son1, My name is %s_%s' % (self.name,self))

class Son2(Father):

    def selfDemo(self):
        print('I am Son2, My name is %s_%s' % (self.name,self))

f1 = Father('Jack')
f2 = Father('Peter')
f1.selfDemo()
Father.selfDemo(f1)
f2.selfDemo()
Father.selfDemo(f2)
s1 = Son1('Jack Son',)
s2 = Son2('Peter Son',)
s1.selfDemo()
s2.selfDemo()
Father.selfDemo(s2)
Son1.selfDemo(s2)
  • 定义一个Father类,有一个name属性,一个selfDemo方法
  • 定义两个子类,一个Son1,一个Son2,两个子类重写了seflDemo方法

其输出如下:

I am Father, My name is Jack_<__main__.Father object at 0x000001DFB5396940>
I am Father, My name is Jack_<__main__.Father object at 0x000001DFB5396940>
I am Father, My name is Peter_<__main__.Father object at 0x000001DFB539F748>
I am Father, My name is Peter_<__main__.Father object at 0x000001DFB539F748>
I am Son1, My name is Jack Son_<__main__.Son1 object at 0x000001DFB539F828>
I am Son2, My name is Peter Son_<__main__.Son2 object at 0x000001DFB539F860>
I am Father, My name is Peter Son_<__main__.Son2 object at 0x000001DFB539F860>
I am Son1, My name is Peter Son_<__main__.Son2 object at 0x000001DFB539F860>

从中可以看出:

  1. f1.selfDemo()与Father.selfDemo(f1)的调用方式是等价的。
  2. s1.selfDemo()与s2.selfDemo()的输出符合预期。即使他们共用了父类的初始化函数,但是因为有self,他们仍然可以将各自的参数准确地传递到方法selfDemo()中。
  3. 这两个语句(Father.selfDemo(s2),Son1.selfDemo(s2)),无论是其父类,还是其他类,都可以显示调用实例。

所以的我self的作用有:

  1. 一个类模板可以创建许多个实例,也可以派生出许多子类,self保证了每个父类的实例或者子类的实例,可以各自调用自身的方法,而不会调用其他实例的方法。换句话说,类中的方法相当于一台车,而声明实例的过程中就把相当于把这台车造出来,并且这个实例的地址(名字)就是这台车的钥匙,self就是那个预留的钥匙孔。当然,这个例子举得不是十分恰当,python中的类也是元类的实例,元类也是一个实例。
  2. 可以通过显示调用,使得子类的实例可以调用其父类的方法,显得灵活了许多。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值