python中的self多余吗


本文摘自php中文网,作者anonymity,侵删。

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

先看一个例子:

1

2

3

4

5

6

7

class Test:

  def prt(self):

    print(self)

    print(self.__class__)

   

t = Test()

t.prt()

执行结果如下

1

2

<__main__.Test object at 0x000000000284E080>

<class '__main__.Test'>

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

self可以不写吗

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

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

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

1

2

3

4

5

6

class Test:

  def prt():

    print(self)

   

t = Test()

t.prt()

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

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

1

2

3

4

Traceback (most recent call last):

 File "h.py", line 6, in <module>

  t.prt()

TypeError: prt() takes 0 positional arguments but 1 was given

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

1

2

3

4

class Test:

  def prt():

    print(__class__)

Test.prt()

运行结果如下

1

<class '__main__.Test'>

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

先看代码

1

2

3

4

5

6

7

8

9

10

11

12

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()

运行结果如下

1

2

3

<__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多余吗的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python print用法是什么

Python 合并多个字典或映射教程

Python中matplotlib库的用法介绍

Python如何提高运行速度

Python中选择排序的实例详解

Python视频爬虫实现下载头条视频

Python实现ping指定ip的示例

一文详解Python网站开发会用到哪些orm框架

Python函数写斐波那契数列

Python编程语言是什么

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...