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. 可以通过显示调用,使得子类的实例可以调用其父类的方法,显得灵活了许多。

猜你喜欢

转载自blog.csdn.net/lonesome_zxq/article/details/85001747