self作为类的初始化init方法中的第一个参数。类的所有实例都有该类的所有方法,因此子类的所有实例都有父类的所有方法。
Python类
在python中所有的类都直接或者间接继承自Object类,定义了类之后就定义了一个命名空间, 里面定义的属性可以通过类名来引用。新定义的类中有一些Object的属性,可以在其中定义变量或者函数。实例化之后会创建一个对象。
class A:
pass
a = A()
此处创建了一个类A, 并且进行了实例化,a为类A的实例化对象。A 类和 a中都包含了 如下一些属性
In [43]: dir(a)
Out[43]:
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
In [78]: A.foo = lambda x : x + 1
In [79]: A.foo(1)
Out[79]: 2
In [80]: a.foo(1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-80-7dc85fd7a693> in <module>()
----> 1 a.foo(1)
TypeError: <lambda>() takes 1 positional argument but 2 were given
self的使用
方法还是指的是通过类的实例化对象调用的函数,方法函数的第一个行参表示类的实例化对象,通常写成self。执行a.foo(1)时就相当于执行A.foo(a, 1),因为A.foo()中只有一个行参,传入的参数多余需要的参数,所以发生类型错误。
Python实例化的过程
class A():
def __init__(self, num):
self.num = num
a = A(15)
这个过程:
1. 产生一个a对象
2. A_a.__init__('a', 15)在将a对象传入__init__构造函数中实例化对象
3. a.__dict__可以查看实例化对象中的属性
总结
Python的类中定义函数时的self关键字和Python的方法函数有关,方法函数由类的实例化对象调用,需要把调用它的实例化对象传入方法函数中,self就是表示实例化对象的行参