python基础===self的理解

Posted botoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/

 

以上是关于python基础===self的理解的主要内容,如果未能解决你的问题,请参考以下文章

python之self的理解

python中with用法理解

Python 运算符重载中__add__(self,other)的other.x如何理解?

Python基础编程214 ● 面向对象 ● 面向对象案例:存放家具

python基础易错题

python之路之前没搞明白4面向对象(封装)