self代表类的实例,而非类。

实例来说明

Python

1

2

3

4

5

6

7

classTest:

defprt(self):

print(self)

print(self.__class__)

t=Test()

t.prt()

执行结果如下

Python

1

2

从上面的例子中可以很明显的看出,self代表的是类的实例。而self.class则指向类。

self不必非写成self

有很多童鞋是先学习别的语言然后学习Python的,所以总觉得self怪怪的,想写成this,可以吗?

当然可以,还是把上面的代码改写一下。

Python

1

2

3

4

5

6

7

classTest:

defprt(this):

print(this)

print(this.__class__)

t=Test()

t.prt()

改成this后,运行结果完全一样。

当然,最好还是尊重约定俗成的习惯,使用self。

self可以不写吗

在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。

有兴趣的童鞋可以把上面的t.prt()一行改写一下,运行后的实际结果完全相同。

实际上已经部分说明了self在定义时不可以省略,如果非要试一下,那么请看下面:

Python

1

2

3

4

5

6

classTest:

defprt():

print(self)

t=Test()

t.prt()

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

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

Python

1

2

3

4

Traceback(most recent call last):

File"h.py",line6,in

t.prt()

TypeError:prt()takes0positional arguments but1was given

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

Python

1

2

3

4

classTest:

defprt():

print(__class__)

Test.prt()

运行结果如下

Python

1

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

先看代码

Python

1

2

3

4

5

6

7

8

9

10

11

12

classParent:

defpprt(self):

print(self)

classChild(Parent):

defcprt(self):

print(self)

c=Child()

c.cprt()

c.pprt()

p=Parent()

p.pprt()

运行结果如下

Python

1

2

3

解释:

运行c.cprt()时应该没有理解问题,指的是Child类的实例。

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

在描述符类中,self指的是描述符类的实例

不太容易理解,先看实例:

Python

1

2

3

4

5

6

7

8

9

10

11

classDesc:

def__get__(self,ins,cls):

print('self in Desc: %s '%self)

print(self,ins,cls)

classTest:

x=Desc()

defprt(self):

print('self in Test: %s'%self)

t=Test()

t.prt()

t.x

运行结果如下:

Python

1

2

3

selfinTest:<__main__.testobjectat0x0000000002a570b8>

selfinDesc:<__main__.desc objectat0x000000000283e208>

大部分童鞋开始有疑问了,为什么在Desc类中定义的self不是应该是调用它的实例t吗?怎么变成了Desc类的实例了呢?

注意:此处需要睁大眼睛看清楚了,这里调用的是t.x,也就是说是Test类的实例t的属性x,由于实例t中并没有定义属性x,所以找到了类属性x,而该属性是描述符属性,为Desc类的实例而已,所以此处并没有顶用Test的任何方法。

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

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

Python

1

2

3

selfinTest:<__main__.testobjectat0x00000000022570b8>

selfinDesc:<__main__.desc objectat0x000000000223e208>

<__main__.desc objectat0x000000000223e208>None

题外话:由于在很多时候描述符类中仍然需要知道调用该描述符的实例是谁,所以在描述符类中存在第二个参数ins,用来表示调用它的类实例,所以t.x时可以看到第三行中的运行结果中第二项为。而采用Test.x进行调用时,由于没有实例,所以返回None。

总结

self在定义时需要定义,但是在调用时会自动传入。

self的名字并不是规定死的,但是最好还是按照约定是用self

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

python prt_Python中的self相关推荐

  1. python调用什么函数实现对文件内容的读取_如何使用python语言中的方法对文件进行读写操作...

    在我们使用python语言中的文件时,可以使用open()方法打开文件,close()方法关闭文件,read()方法读取文件内容,write()方法写入内容到文件中.下面利用几个实例说明文件读写方法, ...

  2. python图像中如何显示中文

    python图像中如何显示中文 在开头加入这两行即可 from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei']

  3. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  4. python 类中定义类_Python中的动态类定义

    python 类中定义类 Here's a neat Python trick you might just find useful one day. Let's look at how you ca ...

  5. Python培训分享:Python新版本中的6个新特性

    Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍. Python培 ...

  6. Python培训常识:Python面试中常被问到的几种设计模式要知道

    学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...

  7. python语言中如何使用注释

    每一种计算机语言都有自己的注释方式,我们知道注释的作用是解释这些代码,方便程序员以后的检查和修改.而且注释的一部分在运行程序的过程中不起作用,也不会显示出来.下面我们将为大家介绍,在python语言中 ...

  8. arcgis里python窗口运行,在 Python 窗口中执行工具

    当第一次打开 Python 窗口时,它会显示类似这样的界面: 左侧区域为 Python 的主提示窗口,在这里执行 Python 命令.右侧区域为帮助和语法窗口,工具运行时,在这里显示执行消息:输入代码 ...

  9. python语言中一切皆对象_2 python 中一切皆对象

    python 中一皆对象 在 python 编程语言中所有的一切都是对象 , python 语言相对于 C++ 或 java 这样的语言 (静态语言), 面向对象这个思想更加的彻底. 2.1 函数和类 ...

最新文章

  1. postman 接口 403 forbidden_接口测试怎么做?
  2. vue :class 动态绑定样式_Vue 在哪些方面做的比 React 更好?
  3. Java实现Huffman哈夫曼树
  4. iOS逆向之旅(进阶篇) — 重签名APP(一)
  5. Android 渗透测试学习手册 第六章 玩转 SQLite
  6. Ubuntu中eclipse端口被占
  7. [bzoj2190][SDOI2008]仪仗队
  8. 大一C语言和线性代数,线性代数:对于编程很重要
  9. 内网计算机ip地址查询,内网ip地址怎么查看_怎么查看内网ip地址_如何查看电脑的内网IP地址...
  10. Rayman的绝顶之路——Leetcode每日一题打卡20
  11. IOI2020国家集训队集中培训通知及如何进入国家集训队
  12. CSAPP lab2 二进制拆弹 binary bombs phase_5
  13. MES系统之设备管理的基础功能
  14. 欧洲城市之最:伦敦被评为欧洲最脏城市 巴黎最不友善
  15. vue路由之路由的两种模式
  16. switch语句的执行顺序
  17. Vue学习笔记(三)Vue2三种slot插槽的概念与运用 | ES6 对象的解构赋值 | 基于Vue2使用axios发送请求实现GitHub案例 | 浏览器跨域问题与解决
  18. 高分子材料S阻燃剂的分类及参考配方
  19. PDF怎么转换成CAD?PDF转CAD教程分享
  20. 学习CSDN右下角弹出广告

热门文章

  1. mysql中数据类型的长度
  2. Java核心类库篇7——多线程
  3. php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php
  4. 小学计算机集体备课,小学信息技术集体备课.doc
  5. 华为手机滑动速度设置_华为手机打字速度慢?开启这个设置,一分钟就能打200字...
  6. redis学习与入门~~~
  7. lisp 读取样条曲线座标点_如何在lisp中求一条直线和一条曲线的交点
  8. document.createelement如何绑定点击事件_番外篇-EXCEL如何使用宏(VBA)
  9. nodejs express use 传值_再也不怕面试官问你express和koa的区别了
  10. 网站需要数据库服务器吗,网站需要独立的服务器数据库吗