• 技术文章 >后端开发 >Python教程

    python中的self多余吗

    anonymityanonymity2019-06-14 16:18:57原创1207
    self代表类的实例,而非类。

    先看一个例子:

    class Test:
      def prt(self):
        print(self)
        print(self.__class__)
      
    t = Test()
    t.prt()

    执行结果如下

    <__main__.Test object at 0x000000000284E080>
    <class '__main__.Test'>

    从上面的例子中可以很明显的看出,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 <module>
      t.prt()
    TypeError: prt() takes 0 positional arguments but 1 was given

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

    class Test:
      def prt():
        print(__class__)
    Test.prt()

    运行结果如下

    <class '__main__.Test'>

    在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Python
    上一篇:一款对python初学者友好的编辑器 下一篇:python缩进是强制吗
    千万级数据并发解决方案

    相关文章推荐

    • python常见语句汇总• python集合是可变类型吗• pycharm和python一样吗• 一款对python初学者友好的编辑器
    1/1

    PHP中文网