为了说清楚 self 是个什么东西,你首选需要搞清实例与类之间的关系。
人就是一种类,人有名字,身高,体重等属性,不同人这些属性都是不一样的,除此之外,人还有很多方法(功能),例如,思考、跑步、睡觉等等。
class Person :
def __init__(self,name) :
self.name = name #定义类的属性
def think(self): # self其实就是类函数think的一个普通参数而已,表示被调用的对象,参数具体值也即我们的实例对象
print("{} is thinking".format (self.name) )
- 1
- 2
- 3
- 4
- 5
- 6
具体到每一个人,例如你自己,你身边的每一个具体的人,都是「人类」的实例对象。**实例继承了类的所有属性和方法。**例如:
xiaoming = Person( "xiaoming")
- 1
我构造了一个叫”xiaoming”的人,它是Person类的实例对象,我们给Person类定义了一个think方法,但是需要一个参数,我们可以把xiaoming这个实例对象传递过去。
>>>Person.think(xiaoming)
xiaoming is thinking
- 1
- 2
所以,这里的 self 其实就是类函数 think 的一个普通参数而已,表示被调用对象,具体值即我们的实例对象,那为什么要叫self呢?其实这是约定俗成的,你叫其他名字也没关系,不过通常不这么做,就好比我们平常交流都是用普通话,突然冒出一句洋文,别人不一定能听懂。
那为什么我们平常调用 think 方法的时候不是这样调用,而是直接用**[实例.方法]**形式调用呢?
>>>Person.think
<function Person.think at 0x110e4f510>
>>> lisi.think
<bound method Person.think of 〈__main__.Person object at 0x10f3a09b0>>
- 1
- 2
- 3
- 4
前者是一个在 Person类 中的普通函数,后者是被绑定了的方法, 因self 其实就是类函数 think 的一个普通参数而已,指被调用对象,参数具体值也即我们的实例对象,当通过[实例.方法]调用时候,该方法与当前实例对象进行了绑定,调用的时候,python会自动把实例对象作为参数传递过去,不需要再传递参数。
>>> xiaoming.think( )
xiaoming is thinking
- 1
- 2
这就是self的概念
说明:
1、self只有在类的方法中才会有,其他函数或方法是不必带self的。
2、在类的方法中(如__init__),第一参数永远是self,表示创建的类实例本身,而不是类本身。
3、针对self参数在调用时不必传入相应的参数。
4、可以把对象的各种属性绑定到self。
5.self不是python的关键字,只是一个约定俗成的,也可以用其他名称命名,但是为了规范和便于读者理解,推荐使用self。
6、类中_init__()方法是一种特殊的方法,被称为类的初始化方法,如果存在初始化值的就需要。
7、self 代表类的实例
class TEST: #创建类
def add(self,a,b): #定义类方法
print(a+b)
test01=TEST() #创建类实例,实例继承了类的所有方法
test01.add(1,3) #实例调用类方法
- 1
- 2
- 3
- 4
- 5
- 6
类参数:
1、定义类可以不需要参数,此时也不需要(),如上
2、可以把类的各种属性绑定到self,并且可以使用__int__()方法初始化值
class mytime(object):
def __init__(self,hour=21, \
minute=13, \
second=50):
self.hour = hour
self.minute = minute
self.second = second
def __str__(self):
return '__str__ hour:minute:second = %02d:%02d:%02d' \
%(self.hour,self.minute,self.second)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3、类的多重继承
#定义父类 classA
class classA(object):
def __init__(self):
print('init action in father class A')
#SubClassB 继承 classA
class SubClassB(classA): #子类继承父类,需要在类名称后面加上父类名
def __init__(self):
print('init action in subclass B')
super(SubClassB,self).__init__() #super()调用父类的一个方法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15