关于类、方法、对象(实例):通过一个例子看一下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(),那么程序将不知道是要调用类里面定义的get_request(),结果就会报错说你的get_request()没定义

如下

至于要不要在类中的方法里面加self,这就涉及到了静态方法、类方法、类(实例)方法了,后面在做区别

原文地址:https://www.cnblogs.com/hanmk/p/9007689.html

时间: 2024-08-06 21:26:39

关于类、方法、对象(实例):通过一个例子看一下self都做了哪些事情的相关文章

类和对象实例(1)

/** * public : 代表访问修饰符 * class :类的标识 *Student : 类名 */public class Student { //对象的两大特征:属性和方法 //类是用来定义和约束对象的属性和方法 /** * 属性:对象所具有的特征 */ //封装类型 String name; //姓名属性 int age ; //年龄属性 char sex; //性别属性 /** * 方法:对象所执行的操作 * 访问修饰符,方法返回值类型 方法名称(){} * 方法名称首字母小写,其

类和对象实例1

定义姓名,性别,年龄,然后赋值,并创建对象调用方法输出姓名,性别,年龄 /** *  * public : 代表访问修饰符  * class : 类的标识 * Student : 类名 * 方法名称首字母小写,其余后面单词首字母大写 * 帕斯卡:首字母大写 * 驼峰命名法:方法名称首字母小写,其余后面单词首字母大写  */ public class Student{ // 封装类型 String name; //姓名 Chaar sex; //性别 int age; //年龄 //显示信息方法

类和对象实例:景区游人类

import java.util.Scanner;   //导包 public class Person { public String name; public int age; /** * 用来循环接收用户输入,然后判断年龄 */ public void show(){ Scanner input=new Scanner(System.in); System.out.println("请输入姓名:"); name=input.next(); //1.循环 while(!name.e

Java类与对象——几个课堂例子的总结及作业

作业:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”. 源代码: 1 import java.util.Scanner; 2 3 class sss123 { 4 //将用来计次的变量times给初始值为0 5 public static int times=0; 6 sss123() { 7 //构造函数,每创建一个实例times就增加1 8 times=times+1; 9 } 10 } 11 12 publi

JAVA类与对象---实例变量与类变量的区别,实例方法和类方法的区别

实例变量 实例变量声明在一个类中,但在方法.构造方法和语句块之外: 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被一个方法.构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息: 实例变量对于类中的方法.构造方法或者语句块是可见的.一般情况下应该把实例变量设为私有.通过使用访问修饰符可以使实例变量对子类可见 实例变量具有默认值.数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默

Scala学习 day01 Scala的类/方法/对象/单例对象

从今天开始,我将尽自己最大努力系统地学习Scala这门语言,希望自己能够坚持下去. Scala中的类 定义规则 class ClassName{     //类中的成员 } 在类定义里,可以放置字段和方法,这些被笼统地称之为成员

类和对象实例(2)

import java.util.Scanner; public class Visitor { String name; int age; public void show() { Scanner input = new Scanner(System.in); while(!"n".equals(name)) { if(age>=18&&age<=60) { System.out.println(name+"您的年龄为:"+age+ &

一个例子看懂socket

一个服务端与多个客户端交互的例子 package j2se.socket; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /**  * Created by jingqing.zhou on 2015/6/17.  * 基于tcp协议的socket通信,实现用户登录  * 服务器端  */ public class server {     

一个例子看清楚JQuery子元素选择器children()和find()的区别

最近在我们的hybrid app项目开发中定位出了一个问题,通过这个问题了解下JQuery选择器find()和children()的区别.问题是这样的:我们的混合app是一个单页面应用(main.html),逻辑上的页面是通过项目自定义的.mspl文件(其实就是html文件)来呈现的.比如a.mspl.b.mspl.c.mspl加载的时候,都会插入到main.html中,但是每次只显示1个mspl文件,当b.mspl显示的时候,a.mspl和c.mspl就会被隐藏.在a.b.c这3 个页面上都会