python中的self多余吗

anonymity
发布: 2019-06-14 16:18:57
原创
2340 人浏览过

self代表类的实例,而非类。

python中的self多余吗

先看一个例子:

class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
登录后复制

执行结果如下

<__main__.Test object at 0x000000000284E080> 
登录后复制

从上面的例子中可以很明显的看出,self代表的是类的实例。而self.class则指向类。

self可以不写吗

在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。

把上面的t.prt()一行改写一下,运行后的实际结果完全相同。

实际上已经部分说明了self在定义时不可以省略

class Test: def prt(): print(self) t = Test() t.prt()
登录后复制

运行时提醒错误如下:prt在定义时没有参数,但是运行时强行传了一个参数。

由于上面解释过了t.prt()等同于Test.prt(t),所以程序提醒多传了一个参数t。

Traceback (most recent call last): File "h.py", line 6, in  t.prt() TypeError: prt() takes 0 positional arguments but 1 was given
登录后复制

如果定义和调用时均不传类实例是可以的,就是类方法。

class Test: def prt(): print(__class__) Test.prt()
登录后复制

运行结果如下

登录后复制

在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。

先看代码

class Parent: def pprt(self): print(self) class Child(Parent): def cprt(self): print(self) c = Child() c.cprt() c.pprt() p = Parent() p.pprt()
登录后复制

运行结果如下

<__main__.Child object at 0x0000000002A47080> <__main__.Child object at 0x0000000002A47080> <__main__.Parent object at 0x0000000002A47240>
登录后复制

解释:

运行c.cprt()时应该没有理解问题,指的是Child类的实例。

但是在运行c.pprt()时,等同于Child.pprt(c),所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,

所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用。

总结

self在定义时需要定义,但是在调用时会自动传入。

self的名字并不是规定死的,但是最好还是按照约定是用self

self总是指调用时的类的实例。

以上是python中的self多余吗的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!