2022年 11月 4日

python中self理解以及类的理解

为了说清楚 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