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/

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM