关于类、方法、对象(实例):通过一个例子看一下self都做了哪些事情
我们在定义一个类时,经常会在类的各个方法中看到self,那么在程序执行时self到底起了什么作用,什么时候要加self,这一点需要我们思考并好好理解。之前在学习时没有想这么多,加之用pycharm写代码,很多地方都自动补全了,有些地方没加self,会提示错误,然后补全,没有想过这个过程,今天刚好整理一下。
1.先简单说明一下self的含义
类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值, Python 会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是 self。
--- 摘自《A Byte of Python3(中文版)》
在类方法中,按惯例第一个第一个参数通常都称为self,这个参数给方法提供一个钩子,从而返回调用的主体,也就是实例对象:因为类可以产生许多实例对象,所以需要这个参数来管理每个实例彼此不同的的数据。
--- 摘自《Python学习手册第3版》
通过上面2段描述可以把self简单理解为实例本身,一般对类进行实例化得到一个实例对象后,通过点记法来调用类中的方法,如下
Object.method(arg1, arg2)
等价于
Class.method(Object, arg1, arg2)
self就是指那个Object
2.实际应用

在上面的例子中,程序执行过程如下:
(1)首先得到一个实例r,(PS.对类进行实例化时是类名后是要加上括号的)
(2)然后通过r.run_main("POST", url, data)来执行程序
(3)其实相当于执行了:RunMethod.run_main(r, "POST", url, data ),也就是说实例本身也是一个参数,只过我们不需要传入self,python已经帮我们处理了
再反观代码结构:
(1)为了达到能够通过实例来调用类中方法的目的,每个方法都必须有一个self参数(这也是类方法和普通函数的区别)
(2)注意到在run_main()方法中我们是通过self来调用get_request()和post_request():self.post_request(url, data)
等价于 ==》 RunMethod.post_request(self, url, data ),
如果不通过self来调用get_request(),那么程序将不知道是要调用类里面定义的post_request(),结果就会报错提示你的 post_request()没定义

至于要不要在类里面的方法中加self,这就涉及到了静态方法、类方法、类(实例)方法的区别了
2018-05-08 21:39:01
关于类、方法、对象(实例):通过一个例子看一下self都做了哪些事情的更多相关文章
- Spark小课堂Week7 从Spark中一个例子看面向对象设计
Spark小课堂Week7 从Spark中一个例子看面向对象设计 今天我们讨论了个问题,来设计一个Spark中的常用功能. 功能描述:数据源是一切处理的源头,这次要实现下加载数据源的方法load() ...
- Java类与对象——几个课堂例子的总结及作业
作业:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”. 源代码: import java.util.Scanner; ...
- Java笔记—— 类与对象的几个例子
问题1 按要求编写java应用程序: 编写西游记人物类,属性有:身高,名字和武器.方法有:显示名字,显示武器. 在main方法中创建两个对象.猪八戒和孙悟空,并分别为他们的两个属性名字和武器赋值,最后 ...
- 通过Class类获取对象实例
通过Class对象获取对象的方式是通过class.newInstance()方式获取,通过调用默认构造参数实例化一个对象. /** * Created by hunt on 2017/6/27. * ...
- JAVA类与对象---实例变量与类变量的区别,实例方法和类方法的区别
实例变量 实例变量声明在一个类中,但在方法.构造方法和语句块之外: 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被 ...
- php 类与对象 面向对象编程 简单例子
<?php class Foo { //类 名称为Foo public $aMemberVar = 'aMemberVar Member Variable'; //类变量 public $aFu ...
- 一个例子看懂所有nodejs的官方网络demo
今天看群里有人用AI技术写了个五子棋,正好用的socket.io,本身我自己很久没看nodejs了,再加上Tcp/IP的知识一直很弱,我就去官网看了下net.socket 发现之前以为懂的一个官方例子 ...
- 从一个例子看现代C++的威力
引子 最近准备重构一下我的kapok库,让meta函数可以返回元素为kv的tuple,例如: struct person { std::string name; int age; META(name, ...
- Python笔记(七):字典、类、属性、对象实例、继承
(一) 简单说明 字典是Python的内置数据结构,将数据与键关联(例如:姓名:张三,姓名是键,张三就是数据).例如:下面这个就是一个字典 {'姓名': '张三', '出生日期': '2899-08 ...
随机推荐
- 【面试篇】必须掌握的Spring 常用注解
注解本身没有功能的,就和 xml 一样.注解和 xml 都是一种元数据,元数据即解释数据的数据,这就是所谓配置. 本文主要罗列 Spring|Spring MVC相关注解的简介. Spring部分 1 ...
- ldap集成nginx
nginx版本:1.10.2 nginx安装: wget http://nginx.org/download/nginx-1.10.2.tar.gz tar zxvf nginx-1.10.2.tar ...
- [c/c++] programming之路(2)、kill QQ,弹出系统对话框,吃内存等
一.删除文件 二.盗取密码的原理 #include<stdlib.h> //杀掉QQ,然后提示网络故障,请重新登陆,弹出高仿界面,获取账号密码,然后打开QQ进行登录 void main() ...
- 使用TortoiseGit从GitHub下拉上传代码配置
转载:http://baijiahao.baidu.com/s?id=1579466751803515477&wfr=spider&for=pc 转载:https://blog.csd ...
- Qt+数据库发布后无法打开数据库
在main.cpp中: QApplication a(argc, argv); QString strLibPath(QDir::toNativeSeparators(QApplication::ap ...
- A^B mod C (快速幂+快速乘+取模)题解
A^B mod C Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63). ...
- hihoCoder week17 最近公共祖先·三 lca st表
记录dfs序列,dfn[tot] 记录第tot次访问的节点 然后查两点在dfs序中出现的第一次 id[u] id[v] 然后 找 dep[k] = min( dep[i] ) {i 属于 [id[u ...
- C# winfrom 当前程序内存读取和控制
https://zhidao.baidu.com/question/31914620.html https://www.cnblogs.com/xcsn/p/4678322.html Process ...
- 用.native修饰器来对外部组件进行构造器内部方法的调用以及用原生js获取构造器里的方法
html <div id="app"> <span v-text="number"></span> <btn @cli ...
- [easyui] - 在easyui的table中展示提示框
因为在easyui的table中字段过多,而无法展示全时,被迫只能使用这个方法. 使用方式: 在 $('#dg').datagrid({ 后的 queryParams: form2Json('sear ...