• python基础===self的理解


    self是类的实例

    self有点类似java中的this,无实际意义。但是约定俗成的都是用self表示类的实例

    class A:
        def func(self):
            print(self)                      #指向的是类的实例
            print(self.__class__)         #指向的是类
    
    a = A()
    a.func()
    #<__main__.A object at 0x02C40F10>
    #<class '__main__.A'>
    
    #a=A() a.func()过程等价于
    A.func(a)

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

    self可不可以省略?

    先看代码,执行情况

    class B:
        def func():
            print("ok!")
    
    b = B()
    b.func()
    
    #TypeError: func() takes 0 positional arguments but 1 was given

    报错了,原因很简单。b=B()    b.func()过程等价于 B.fun(b),func()在B类中是不需要参数的,所以多传了一个参数b,就会报错

    那么要想执行成功,就需要执行:

    >>>B.func()

    继承中的self

    class Parent():
        def p(self):
            print(self)
    
    class Child(Parent):
        def c(self):
            print(self)
    
    c = Child()
    c.c()
    c.p()       
    p = Parent()
    p.p()
    
    #<__main__.Child object at 0x02CE6270>
    #<__main__.Child object at 0x02CE6270>
    #<__main__.Parent object at 0x02CE6C90>

    运行c.p()时,等同于Child.p(c),所以self指的依然是Child类的实例

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

    class Desc:
        def __get__(self, ins, cls):
            print('self in Desc: %s ' % self )
            print(self, ins, cls)
    class Test:
        x = Desc()
        def prt(self):
            print('self in Test: %s' % self)
    t = Test()
    t.prt()
    t.x
    
    
    self in Test: <__main__.Test object at 0x0000000002A570B8>
    self in Desc: <__main__.Desc object at 0x000000000283E208>
    <__main__.Desc object at 0x000000000283E208> <__main__.Test object at 0x0000000002A570B8> <class '__main__.Test'>

    这里调用的是t.x,也就是说是Test类的实例t的属性x,由于实例t中并没有定义属性x,所以找到了类属性x,而该属性是描述符属性,为Desc类的实例而已,所以此处并没有顶用Test的任何方法。

    参考资料:

    http://python.jobbole.com/81921/

  • 相关阅读:
    @Value不能给静态变量直接赋值问题
    jmeter测试http请求
    SqlServer单步调试
    mysql锁住 Lock wait timeout exceeded; try restarting transaction
    django在model中添加字段报错
    django admin下拉列表不显示值,显示为object的处理
    (原创推荐文章)kerberos服务器端与客户端
    kafka安装与测试
    Linux shell判断文件和文件夹是否存在
    df -h 卡死 如何解决
  • 原文地址:https://www.cnblogs.com/botoo/p/9013204.html
Copyright © 2020-2023  润新知