python

超轻量级php框架startmvc

Python中的self用法详解

更新时间:2020-07-21 01:36:01 作者:startmvc
在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。

在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法。

class是面向对象的设计思想,instance(也即是 object,对象)是根据 class 创建的。

一个类(class)应该包含数据和操作数据的方法,通俗来讲就是属性和函数(即调用方法)。

类 class 中为啥用使用 self ?

在类的代码(函数)中,需要访问当前的实例中的变量和函数,即访问Instance中的:

对应的变量(property):Instance.ProperyNam,去读取之前的值和写入新的值。

调用对应函数(function):Instance.function(),即执行对应的动作。

  • -> 而需要访问实例的变量和调用实例的函数,当然需要对应的实例Instance对象本身。
  • -> 而Python中就规定好了,函数的第一个参数,就必须是实例对象本身,并且建议,约定俗成,把其名字写为self。
  • -> 所以,我们需要self(需要用到self)。

首先,在Python中类的定义:

在python中,类是通过关键字 class 定义的:

class 后面紧跟类名,即 Person,类名通常大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的,通常,如果没有合适的 继承类,就使用 object 类,这是所有类最终都会继承的类。


class Box(object):

 def __init__(self, boxname, size, color):

 self.boxname = boxname

 self.size = size

 self.color = color # self就是用于存储对象属性的集合,就算没有属性self也是必备的

 

 def open(self, myself):

 print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

 print('-->用类自己的self,打开那个%s,%s的%s' % (self.color, self.size, self.boxname))

 

 def close(self):

 print('-->关闭%s,谢谢' % self.boxname)

 

 

b = Box('魔盒', '14m', '红色')

b.close()

b.open(b) # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。

print(b.__dict__) # 这里返回的就是self本身,self存储属性,没有动作。

1564998302930831.png

self代表类的实例,而非类;self 就是 对象/实例 属性集合

Box 是个类-----》self 实例化------》 b对象/ 实例

class 抽象体------》实例化------》对象/实例,含有属性:{'boxname':'魔盒', ‘size':‘14m', 'color':'red'},即 self

self 看似是整个对象,实际上清楚地描述了类就是产生对象的过程,描述了 self 就是得到了 对象,所以 self 内的键值可以直接使用

正如自然界中一个有效的对象,必须包括:

1、描述对象的属性;2、对象的方法

所以 self是必须的,也是对象中重要的特性。

看下面的代码,感觉就更神奇了:


class Box(object):

 def myInit(mySelf, boxname, size, color):

 mySelf.boxname = boxname

 mySelf.size = size

 mySelf.color = color # 自己写一个初始化函数,一样奏效,甚至不用self命名。其它函数当中用标准self

 return mySelf # 返回给实例化过程一个对象!神奇!并且含有对象属性/字典

 

 # def __init__(self, boxname, size, color):

 # self.boxname = boxname

 # self.size = size

 # self.color = color #注释掉原来标准的初始化

 

 def open(self, myself):

 print(self)

 print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

 print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

 

 def close(self):

 print('-->关闭%s,谢谢' % self.boxname)

 

 

# 经过改造,运行结果和标准初始化没区别

 

b = Box().myInit('魔盒', '14m', '红色')

# b = Box('魔盒', '14m', '红色')#注释掉原来标准的初始化方法

b.close()

b.open(b) # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。

print(b.__dict__) # 这里返回的就是self本身,self存储属性,没有动作。

1564998324254354.png

换个角度来讲,对类的操作有:

1、定义属性 ; 2、调用方法

对类的反馈有:

1、得到属性 ; 2、执行方法

在 class 类的函数中,为什么 self是必要的,因为 self 是对象的载体,可以理解成一个字典,看下面代码:


class Box(object):

 def myInit(mySelf, boxname, size, color):

 print(mySelf.__dict__)#显示为{}空字典

 mySelf.boxname = boxname

 mySelf.__dict__['aa'] = 'w'#甚至可以像字典一样操作

 mySelf.size = size

 mySelf.color = color # 自己写一个初始化函数,一样奏效,甚至不用self命名。其它函数当中用标准self

 return mySelf # 返回给实例化过程一个对象!神奇!并且含有对象属性/字典

 

 # def __init__(self, boxname, size, color):

 # self.boxname = boxname

 # self.size = size

 # self.color = color #注释掉原来标准的初始化

 

 def open(self, myself):

 print(self)

 print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

 print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))

 

 def close(self):

 print('-->关闭%s,谢谢' % self.boxname)

 

 

# 经过改造,运行结果和标准初始化没区别

 

b = Box().myInit('魔盒', '14m', '红色')

# b = Box('魔盒', '14m', '红色')#注释掉原来标准的初始化方法

b.close()

b.open(b) # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。

print(b.__dict__) # 这里返回的就是self本身,self存储属性,没有动作。

1564998355181754.png

注意此处的: mySelf.__dict__['aa'] = 'w' #甚至可以像字典一样操作; 在 b.__dict__ 的结果中显示为:'aa':'w'

故可以把 self 理解成存储 实例化对象属性的字典(dict), self 存储属性,而没有动作执行。

self总是指调用时的类的实例。

python 中一些特殊的实例变量:

1、私有变量(private),只有内部可以访问,外部不能访问,私有变量是在名称前以两个下划线开头,如:__name,其实私有变量也不是完全不能被外部访问,不能直接访问是因为python解释器对外把 __name 变量改成了 _类名__name,所仍然可以通过 _类名__name 来访问 __name。

2、在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。

3、以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

以上就是一文读懂Python中的self的详细内容,更多请关注脚本之家其它相关文章!

Python self