zoukankan      html  css  js  c++  java
  • python-self

    python中的self

    self代表的是类的实例,不是类对象

    class zx():
        def h(self):
            print(self)
            print(self.__class__)
    
    x=zx()
    x.h()
    zx.h(x)
    #x.h()=zx.h(x)
    
    <__main__.zx object at 0x000001A2BA70FE48>
    <class '__main__.zx'>
    <__main__.zx object at 0x000001A2BA70FE48>
    <class '__main__.zx'>
    

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

    self不写也行

    其实self不是强制性的,不写也行,但是调用的话只支持类对象调用自己的函数,实例不能调用,为啥?Python的解释器内部,当我们调用z.h()时,会把他解释成zx.h(x),函数明明不需要参数,我们却给他传了一个参数,根据报错可知

    class zx():
        def h():
            print("不写也行")
    
    z=zx()
    zx.h()
    z.h()
    
    不写也行
    Traceback (most recent call last):
      File "C:/Users/Administrator/Desktop/01python/研究/自带self查找/zx.py", line 7, in <module>
        z.h()
    TypeError: h() takes 0 positional arguments but 1 was given
    

    在描述符类中,self指的是描述符类的实例

    描述符比较特殊,看结果

    class zx:
      def __get__(self, ins, cls):
        print(self)
        print(ins)
        print(cls)
    class Test:
      x = zx()
      def prt(self):
        print(self)
    t = Test()
    t.prt()
    t.x
    
    <__main__.Test object at 0x00000132B602FCF8>
    <__main__.zx object at 0x00000132B602FDA0>
    <__main__.Test object at 0x00000132B602FCF8>
    <class '__main__.Test'>
    
    class zx:
      def __get__(self, ins, cls):
        print(self)
        print(ins)
        print(cls)
    class Test:
      x = zx()
      def prt(self):
        print(self)
    t = Test()
    t.prt()
    Test.x
    
    <__main__.Test object at 0x00000189D981FCF8>
    <__main__.zx object at 0x00000189D981FDA0>
    None
    <class '__main__.Test'>
    
  • 相关阅读:
    1372
    SPOJ
    HDU 3966-Aragorn's Story 树链剖分+树状数组
    LightOJ 1348
    HihoCoder 1568 不一定合法括号序列
    LightOJ 1343
    LightOJ 1266
    LightOJ 1112
    HihoCoder 1328 BFS 搜索
    链表交集、合并、排序
  • 原文地址:https://www.cnblogs.com/zx125/p/11503555.html
Copyright © 2011-2022 走看看