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/
纸上得来终觉浅,绝知此事要躬行!