python什么时候加self,什么时候不加self
1、self是什么,一般都说指对象本身,这样说了没了用,说了后还是很难懂,因为这样说了后,仍然完全搞不清楚,什么时候变量前需要加self,什么时候不需要加self。
造成很多人,已经怕了self,不停地测试,加self减self来测试代码,或者干脆不知道要不要self,所有变量前面一律加self,这样就能瞎猫碰死老鼠了,但不弄清楚,长期这样做法有点悲剧。
2、所以不需要这么去想self代表对象本身,换个思维应该认为self是全局变量,如果变量前面加了self,那么在任何实例方法(非staticmethod和calssmethod)就都可以访问这个变量了,如果没有加self,只有在当前函数内部才能访问这个变量。
3、根据pep8,所有的加了self的变量,需要确保是在__init__中首次出现,这是因为和java不一样,python没有成员声明,python一下子很难知道有哪些成员变量,所以最好确保所有带self前缀的变量是在__init__中首次出现。这条规则可以使用pycahrm的静态检查来证实或者pylint工具来证明。
4、重中之重就是前缀带self的变量,就是在整个类的代码块里面类似是作为全局变量,这样想后就不会出现不知道要不要self或者瞎全加self。
5、错误的例子就是这样,比如unitetst用例里面:
def test_login(self):
self.url = xxx
self.resp = self.session.get(self.url)
self.text = self.resp.text
self.status = self.resp.statuscode
要加这么多self干鸟。这些都是局部的,别的方法里面不需要访问这些变量,完全是需要去掉这些self。
除了session属性需要共用以外,其他都要去掉,不然造成很大的误导,会以为这些变量也需要在其他方法中去使用它。
6、叫this或者任何其他的也可以,但是self是pycharm自动补全出来的,没必要再手动修改搞成this。
class A():
def __init__(self,x):
self.x = x def show(this):
print(this.x) A(1).show() 7、为什么不直接在类下面写,然后使用类方法cls.xxx访问,self和cls区别?
类属性是所有实例共享一份,需要看情况,需要多实例并且属性互不干扰需要使用self,需要所有实例保持使用同一个属性使用类属性。
一个类的多个实例就相当于一个模块的无限复制,但这些实例(伪模块)的内部状态(全局变量)是存在多份的,互不干扰的,这是使用面向对象很大的一个优点。模块和类的实例可以比较,拿函数和类比区别,简直是问得牛头不对马嘴的伪问题,就是问吃饭和人有什么区别 嘴巴和人有什么区别一样,问人和猪有什么区别才值得回答。 8.如果代码没有使用面向对象封装,只是有class外壳,那就直接写成函数好了,没有slef的困扰。否则即使写了class 类也是无效装逼废物类,这种类是怎么样的,需要怎么改变成有效面向对象类,需要看面向对象四步走里面的博客
关于pythoh面向过程开发人员三步转面向对象的补充,再加一步,四步走战略。转面向对象也可以有固定公式。
。
上面说的是从思想上面怎么判断力一个类是不是无效废物类,那么从代码层面如何判断呢?很简单吧所有类的方法上加上@classmethod,所有代码还能正常直接运行,这种情况下,除了需要作为纯工具类以外,9成9就是无效废物类类,这种调用 类名 + 方法不如直接写成 模块 + 函数来调用。 贴一个无效废物类,里面没有成员变量也没有调用成员变量

就算是吧add方法和print_something方法换成静态方法,稍微说得过去,如果类里面没有其他方法和成员变量和实例方法,那也算无效装逼废物滑稽类。
python什么时候加self,什么时候不加self的更多相关文章
- Python调用函数加括号和不加括号的区别
Python调用函数加括号和不加括号的区别 # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2018/7/3 10:03 # @Desc ...
- self是什么?什么时候加?什么时候不加?
Python里边self倒底是什么?什么时候加self?什么时候不加? self是什么? 如果你问别人大多人回答是: 指对象本身,然后噼里啪啦说一堆,然后听完的你,仍然完全搞不清楚,什么时候变量前需要 ...
- python 怎么模拟加header(如User-Agent、Content-Type等等)
# -*- coding: cp936 -*- #python 27 #xiaodeng #python 怎么模拟加header(如User-Agent.Content-Type等等) #办法一: i ...
- SpringMVC路径问题回顾,加斜杠和不加斜杠的问题(六)
绝对路径:全的路径. 相对路径:有参照的路径. 加斜杠和不加斜杠的问题如下:(分前台和后台路径,明白这两个就知道什么意思了) 如果是页面,这个图片路径出现在jsp页面,所以是前台路径,前台路径的参照物 ...
- python列表可以加可以乘
python列表可以加可以乘 list=['abcd',786,2.23,'runoob',70.2] tinylist = [123,'runoob'] print(list) print(list ...
- jquery 调用函数时加()和不加()的执行顺序是不同的
编写JQUERY(3.0,向下兼容3.0)代码当我们调用一个函数时可以不加括号,但加括号与不加括号是不同的.如下代码: $(function(){ a(b);//先打印a 再打印 b a(b());/ ...
- mysql加单引号和不加单引号的性能比较
刚刚我们说过了,生活中难免会有一些不如意,比如,我们用一个字符串类型的字段来作为主键,表面上,这太不如意了,然而,事实也证明这是有用的.问题也就出来了,当在查询语句中对该字段值加上单引号和不加查询耗时 ...
- python 如何重新加载有修改过的模块(module)
写 Python 程序的时候,一边写模块一边调试.调试是在 Python 自身的命令行终端进行的.但当对模块里的代码进行修改后,在原调试终端上执行到模块中新修改上去的内容. 我之前是一直用退出再重新进 ...
- 利用python进行数据加载和存储
1.文本文件 (1)pd.read_csv加载分隔符为逗号的数据:pd.read_table从文件.URL.文件型对象中加载带分隔符的数据.默认为制表符.(加载为DataFrame结构) 参数name ...
随机推荐
- python系统编程(九)
同步的概念 1. 多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改10次,num的最终的结果应该为20. 但是由于是多线程访问,有可能出现下面情 ...
- bootcdn
BootCDN 是 Bootstrap 中文网支持并维护的前端开源项目免费 CDN 服务,致力于为 Bootstrap.jQuery.Angular.Vuejs 一样优秀的前端开源项目提供稳定.快速的 ...
- 【C语言程序】让用户输入十个数,用冒泡排序法从小到大排序
#include <stdio.h> #define N 10 void swap(int*a,int*b); int main(int argc, char *argv[]) { in ...
- Ubuntu1404安装eclipse(目的是为了运行python,当然java更可以)
原创文章,不得转载 我是彩印网(www.caiyin.com) 的技术开发人员,在这里首先请允许我做下业务的介绍 彩印网是由北京出彩电子商务有限公司运营的专业印刷电商,集线上购物.支付.设计.制作.配 ...
- svn提交报错Previous operation has not finished; run 'cleanup' if it was interrupted
从SVN上拉下来Document文档(word和excel),在本地修改后,准备通过TortoiseSVN提交,发现报错. Error: Previous operation has not fini ...
- db2 load报文件系统满
使用db2 load导入数据 数据量比较大时常常会报文件系统已满错误. 原因分析:导入表建有索引,在load的“索引复制”阶段会从系统临时表空间拷贝到目标表空间,导致系统临时表空间所在的文件系统满,l ...
- Linux命令第四篇
作业四: 1) 新建目录/test/dir,属主为tom,数组为group1,/test目录的权限为777 # useradd tom [root@localhost /]# groupadd gr ...
- Tips_方格拼图效果
用原生的javascript实现方格拼图效果 1.新建文件夹 代码如下: 01.html <!DOCTYPE html> <html lang="en"> ...
- Mac安装Linux的KVM管理工具virt-manager
安装: brew tap jeffreywildman/homebrew-virt-manager brew install virt-manager virt-viewer 中途会碰到很多问题,可以 ...
- C# RabbitMQ延迟队列功能实战项目演练
一.需求背景 当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取消,同时给用户发送一份邮件提醒.那么我们应用程序如何实现这样的需求场景呢?在之前 ...