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/

 

posted @ 2018-05-09 11:28  AAA五金批发王建军  阅读(1199)  评论(0编辑  收藏  举报