python类中的self和变量用法及说明

 更新时间:2022年11月24日 10:21:22   作者:to_qin  
这篇文章主要介绍了python类中的self和变量用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

在python的类中会使用到“self”,本文主要是谈谈类中的self和变量的关系。

先看示例代码I。

class Test(object):
    def __init__ (self, val1):
        self.val0 = val1
    def fun1(self):
        print(self.val0)
    def fun2(self, val2):
        print(val2)
    def fun3(self):
        print(self.fun1)
        self.fun1()

ins=Test(123)
ins.new_val=”I'm a new value”

1、self是什么

在python的类中self代表实例本身,具体来说,是该实例的内存地址。

在调用实例的方法时,Python解释器会自己把实例变量传给类的函数中的self。

以上述代码I为例

代码I定义了一个类Test,在这个类中,self为参数变量,在类Test实例化得到实例ins时,python解释器自动调用__init__,执行Test.init(ins, 123),该self可接收实例ins的内存地址,从而self代表了

实例本身。类似的,如果实例化ins后,执行ins.fun1( ),python解释器会将ins.fun1( )解释成Test.fun1(ins)。可见,self这个变量是无需用户手动传送值的,解释器会自动帮我们给其传递实例。

需要注意的是,self不是关键字,换言之,可以用其它的合法变量名替换self,但是,规范和标准建议我们一致使用self。

2、self的使用场景

在类中,self的使用有下面3个场景

1)self为类中的函数的第一个参数,例如在类中,def fun1(self, …)。

上文说过,“在调用实例的方法时,Python解释器会自己把实例变量传给类的函数中的self”,如果类的函数的第一个参数不是代表实例的self,则调用实例的方法时,该方法没有参数接收解释器自动传入的实例变量,从而程序会产生异常。

事实上,“和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数”(廖雪峰老师说的)。

2)在类中,引用实例的属性,示例:self.变量名(如self.val0)。

引用实例的属性的目的是为实例绑定属性、写入或读取实例的属性。

例如,在代码I中,在类的函数__init__中,“self.val1 = val1”将属性val0绑定到了实例self(类实例化成ins后,self就代表实例ins了)上,并且将变量val1的值赋给了实例的属性val0。

在函数fun1中,print(self.val0),读取了实例self的值val0,并打印出来,当然,在函数中修改属性val0的值也是可以的。

3)在类中,调用实例的方法,例如,self.fun1();获取实例的方法的地址,例如self.fun1。

类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。既然,self代表实例,则可以“self.函数名”的方式表示实例的方法地址,以“self.函数名()”的方式,调用实例的方法。在类的定义中,以及实例化后对实例方法的调用,都可以这样做。

3、python的几种变量——按作用域分

1、全局变量:在模块内、在所有函数外面、在class外面,这就是全局变量。

2、局部变量:在函数内、在class的方法内(未加self修饰的) ,这就是局部变量

3、静态变量(也可以说,类属性):在class内的,但不在class的方法内的,这就是静态变量

4、实例变量(也可以说,实例属性):在class的方法内的,用self修饰的变量,这就是实例变量

注意,根据其他的分类方法可以得到其他的类别,例如私有变量。

4、self和变量的关系

综合上述的1、2和3点,可以得到在类中,self和变量的关系了,一言以蔽之,被self修饰的变量是实例变量,不被self修饰的变量不是实例变量。

实例变量有什么作用,或者说,什么时候应该使用self修饰变量比较好?我的总结如下:

当我们想将某个变量绑定给实例时,就在类中,使用self修饰该变量。一般来说,类实例化为不同实例后,为了不同实例的某一变量互不干扰,就将该变量绑定给实例。

具体的使用场景

1)若需要在类的不同方法中调用同一变量,且属于同一个类的不同实例的该变量互不影响(即排除类属性),则在类中将该变量绑定给实例。

2)需要在类实例化得到实例后,修改、或引用实例的某变量,则在类中将该变量绑定给实例。

5、一点补充

为实例绑定属性有两种方式

1)在类的函数__init__中,为实例绑定变量。

这也是本文讨论的场景。

根据pep8,所有的加了self的变量,需要确保是在__init__中首次出现,虽然不这样做有些场景下程序也不会出错,但按照规定来吧。

2)在实例化后,为实例绑定新的属性。例如,实例变量.属性变量=值

由于Python是动态语言,从而,根据类创建的实例可以任意绑定属性。通过实例变量给实例绑定属性是方法之一,例如代码I中的,ins.newval=”I’m a new value”,为实例绑定了属性newval。不过,这不是本文讨论的关注点。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python2.7 json 转换日期的处理的示例

    python2.7 json 转换日期的处理的示例

    这篇文章主要介绍了python2.7 json 转换日期的处理的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Python 实现中值滤波、均值滤波的方法

    Python 实现中值滤波、均值滤波的方法

    今天小编就为大家分享一篇Python 实现中值滤波、均值滤波的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python实用库 PrettyTable 学习笔记

    Python实用库 PrettyTable 学习笔记

    这篇文章主要介绍了Python实用库 PrettyTable 学习笔记,结合实例形式分析了Python表格操作库PrettyTable的安装、使用技巧与相关注意事项,需要的朋友可以参考下
    2019-08-08
  • Python入门_浅谈逻辑判断与运算符

    Python入门_浅谈逻辑判断与运算符

    下面小编就为大家带来一篇Python入门_浅谈逻辑判断与运算符。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python中random模块生成随机数详解

    Python中random模块生成随机数详解

    本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下
    2016-03-03
  • Python采集C站高校信息实战示例

    Python采集C站高校信息实战示例

    这篇文章主要为大家介绍了Python采集C站高校信息实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Python树莓派学习笔记之UDP传输视频帧操作详解

    Python树莓派学习笔记之UDP传输视频帧操作详解

    这篇文章主要介绍了Python树莓派学习笔记之UDP传输视频帧操作,结合实例形式详细分析了Python树莓派编程中使用UDP协议进行视频帧传输的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-11-11
  • python 实现批量图片识别并翻译

    python 实现批量图片识别并翻译

    这篇文章主要介绍了python 实现批量图片识别并翻译,帮助大家利用python处理图片,感兴趣的朋友可以了解下
    2020-11-11
  • 自己搭建resnet18网络并加载torchvision自带权重的操作

    自己搭建resnet18网络并加载torchvision自带权重的操作

    这篇文章主要介绍了自己搭建resnet18网络并加载torchvision自带权重的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python函数的默认参数请勿定义可变类型详解

    python函数的默认参数请勿定义可变类型详解

    这篇文章主要介绍了python函数的默认参数请勿定义可变类型详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论