返回顶部
首页 > 资讯 > 后端开发 > Python >Python中的self怎么使用
  • 268
分享到

Python中的self怎么使用

Pythonself 2023-05-17 22:05:07 268人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

在介绍python的self用法之前,先来介绍下Python中的类和实例我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示。而实例是根据类创

在介绍python的self用法之前,先来介绍下Python中的类和实例
我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示。而实例是根据类创建出来的一个个具体的“对象”,每一个对象都从类中继承有相同的方法,但各自的数据可能不同。
1、以Student类为例,在Python中,定义类如下:

class Student(object):
    pass

(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类。

2、实例:定义好了类,就可以通过Student类创建出Student的实例,创建实例是通过类名+()实现:

student = Student()

3、由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Student类时,把name、score等属性绑上去:

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

这里注意:(1)、__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。(2)、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去:

>>>student = Student("Hugh", 99)
>>>student.name
"Hugh"
>>>student.score
99

另外,这里self就是指类本身,self.name就是Student类的属性变量,是Student类所有。而name是外部传来的参数,不是Student类所自带的。故,self.name = name的意思就是把外部传来的参数name的值赋值给Student类自己的属性变量self.name

4、和普通数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。除此之外,类的方法(函数)和普通函数没啥区别,你既可以用默认参数、可变参数或者关键字参数*args是可变参数,args接收的是一个tuple**kw是关键字参数,kw接收的是一个dict)。

5、既然Student类实例本身就拥有这些数据,那么要访问这些数据,就没必要从外面的函数去访问,而可以直接在Student类的内部定义访问数据的函数(方法),这样,就可以把”数据”封装起来。这些封装数据的函数是和Student类本身是关联起来的,称之为类的方法:

class Student(obiect):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def print_score(self):
        print "%s: %s" % (self.name, self.score)
>>>student = Student("Hugh", 99)
>>>student.print_score
Hugh: 99

这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score。而如何打印,都是在Student类的内部定义的,这些数据和逻辑被封装起来了,调用很容易,但却不知道内部实现的细节。

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score
    def print_score(self):
        print "%s: %s" %(self.__name,self.__score)

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:

>>> student = Student('Hugh', 99)
>>> student.__name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:

class Student(object):
    ...

    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score

如果又要允许外部代码修改score怎么办?可以给Student类增加set_score方法:

class Student(object):
    ...

    def set_score(self, score):
        self.__score = score

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

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

封装的另一个好处是可以随时给Student类增加新的方法,比如:get_grade:

class Student(object):
    ...
    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

同样的,get_grade方法可以直接在实例变量上调用,不需要知道内部实现细节:

>>> student.get_grade()
'A'

6、self的仔细用法
(1)、self代表类的实例,而非类。

class Test:
    def ppr(self):
        print(self)
        print(self.__class__)

t = Test()
t.ppr()
执行结果:
<__main__.Test object at 0x000000000284E080>
<class '__main__.Test'>

从上面的例子中可以很明显的看出,self代表的是类的实例。而self.__class__则指向类。
注意:把self换成this,结果也一样,但Python中最好用约定俗成的self。
(2)、self可以不写吗?
在Python解释器的内部,当我们调用t.ppr()时,实际上Python解释成Test.ppr(t),也就是把self替换成了类的实例。

class Test:
    def ppr():
        print(self)

t = Test()
t.ppr()

运行结果如下:

Traceback (most recent call last):
File "cl.py", line 6, in <module>
t.ppr()
TypeError: ppr() takes 0 positional arguments but 1 was given

运行时提醒错误如下:ppr在定义时没有参数,但是我们运行时强行传了一个参数。

由于上面解释过了t.ppr()等同于Test.ppr(t),所以程序提醒我们多传了一个参数t。

这里实际上已经部分说明了self在定义时不可以省略。

当然,如果我们的定义和调用时均不传类实例是可以的,这就是类方法。

class Test:
    def ppr():
        print(__class__)

Test.ppr()

运行结果:
<class '__main__.Test'>

(3)、在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。

class Parent:
    def pprt(self):
        print(self)

class Child(Parent):
    def cprt(self):
        print(self)
c = Child()
c.cprt()
c.pprt()
p = Parent()
p.pprt()

运行结果:

<__main__.Child object at 0x0000000002A47080>
<__main__.Child object at 0x0000000002A47080>
<__main__.Parent object at 0x0000000002A47240>

解释:
运行c.cprt()时应该没有理解问题,指的是Child类的实例。
但是在运行c.pprt()时,等同于Child.pprt(c),所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用。

(4)、在描述符类中,self指的是描述符类的实例

class Desc:
    def __get__(self, ins, cls):
        print('self in Desc: %s ' % self )
        print(self, ins, cls)
class Test:
    x = Desc()
    def prt(self):
        print('self in Test: %s' % self)
t = Test()
t.prt()
t.x

运行结果如下:

self in Test: <__main__.Test object at 0x0000000002A570B8>
self in Desc: <__main__.Desc object at 0x000000000283E208>
<__main__.Desc object at 0x000000000283E208> <__main__.Test object at 0x0000000002A570B8> <class '__main__.Test'>

这里主要的疑问应该在:Desc类中定义的self不是应该是调用它的实例t吗?怎么变成了Desc类的实例了呢?
因为这里调用的是t.x,也就是说是Test类的实例t的属性x,由于实例t中并没有定义属性x,所以找到了类属性x,而该属性是描述符属性,为Desc类的实例而已,所以此处并没有顶用Test的任何方法。

那么我们如果直接通过类来调用属性x也可以得到相同的结果。

下面是把t.x改为Test.x运行的结果。

self in Test: <__main__.Test object at 0x00000000022570B8>
self in Desc: <__main__.Desc object at 0x000000000223E208>
<__main__.Desc object at 0x000000000223E208> None <class '__main__.Test'>

以上就是Python中的self怎么使用的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Python中的self怎么使用

本文链接: https://lsjlt.com/news/211547.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中的self怎么使用
    在介绍Python的self用法之前,先来介绍下Python中的类和实例我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示。而实例是根据类创...
    99+
    2023-05-17
    Python self
  • python中self怎么使用
    python 中的 self 是一个特殊变量,用于引用当前实例,允许对象访问其自身的数据和方法。在类方法和实例方法中,它应作为第一个参数使用,尤其当方法需要访问对象私有数据、调用另一个对...
    99+
    2024-05-22
    python
  • php中的self怎么使用
    这篇文章主要介绍了php中的self怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php中的self怎么使用文章都会有所收获,下面我们一起来看看吧。在PHP中,self的意思是“自己、本身”;self关...
    99+
    2023-06-29
  • laravel中的self怎么使用
    这篇文章主要介绍“laravel中的self怎么使用”,在日常操作中,相信很多人在laravel中的self怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”laravel中的self怎么使用”的疑惑有所...
    99+
    2023-06-29
  • 使用python怎么在变量中添加self
    这篇文章给大家介绍使用python怎么在变量中添加self,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、说明前缀带self的变量,就是在整个类的代码块里面类似是作为全局变量,如果变量前面加了self,那么在任何实例...
    99+
    2023-06-15
  • python中的this——self
        #0、python中的self相当于this ,    #1、如果调用成员变量必须使用self,    #2、self不一定叫self可以改变它的名称。    #3、在成员函数中使用self.name变量相当于声明了一个成员变量 ...
    99+
    2023-01-31
    python
  • Python中的self的介绍
    Python中的self的介绍 在Python中,self是一个特殊的关键字,用于表示类的实例对象本身。在类的方法中,通过self来引用对象的属性和方法。self参数并不是Python...
    99+
    2024-02-23
  • python中self的原理是什么
    本篇文章为大家展示了python中self的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(...
    99+
    2023-06-14
  • 关于python中的self,ins ,
    关于python中的self,ins,cls的解释参考下面两篇博文首先是self: (参考http://www.cnblogs.com/linuxcat/archive/2012/01/05/2220997.html)self比较好理解,s...
    99+
    2023-01-31
    python ins
  • 全面理解Python中self的用法
    刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数?你看完这篇文章后就会明白所有的疑问。 self代表类的实例,而非类。 实例来...
    99+
    2022-06-04
    Python
  • python类中为什么要self?
    在python中创建类时必须有一个self参数, eg: >>> class miss: ...               def mi(self): ...             print "i like pyt...
    99+
    2023-01-31
    类中 python
  • Python类中self的含义是什么
    在Python中,`self`是一个惯用的参数名,用于表示对象自身。它在类的方法中作为第一个参数传递,用于访问该对象的属性和方法。当...
    99+
    2023-10-12
    Python
  • python实例方法中self有什么用
    今天就跟大家聊聊有关python实例方法中self有什么用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、说明无论是创建类的构造方法还是实例方法,最少要包含一个参数self。通过实...
    99+
    2023-06-15
  • Python里的Self是什么
    这篇文章主要介绍“Python里的Self是什么”,在日常操作中,相信很多人在Python里的Self是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python里的Self是什么”的疑惑有所帮助!接下来...
    99+
    2023-07-06
  • 如何理解Python中的self
    这篇文章主要介绍了如何理解Python中的self的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何理解Python中的self文章都会有所收获,下面我们一起来看看吧。对于初学Python的同学来说,在clas...
    99+
    2023-07-05
  • Python中self用法实例详解
    在介绍Python的self用法之前,先来介绍下Python中的类和实例……我们知道,面向对象最重要的概念就是类(class)和实例(instance),...
    99+
    2023-03-22
    Python中self用法 Python中self用法
  • css的align-self属性怎么用
    小编给大家分享一下css的align-self属性怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   align-sel...
    99+
    2024-04-02
  • vue中的.capture和.self怎么区分
    今天小编给大家分享一下vue中的.capture和.self怎么区分的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。.capt...
    99+
    2023-06-30
  • Python中self的四个秘密分别是什么
    这篇文章给大家介绍Python中self的四个秘密分别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。self的谜团毫无疑问,几乎每一门Python课程都有一个关于(class)类...
    99+
    2024-04-02
  • php类中static与self的使用区别浅析
    使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: 使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作