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的更多相关文章

  1. Python调用函数加括号和不加括号的区别

    Python调用函数加括号和不加括号的区别 # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2018/7/3 10:03 # @Desc ...

  2. self是什么?什么时候加?什么时候不加?

    Python里边self倒底是什么?什么时候加self?什么时候不加? self是什么? 如果你问别人大多人回答是: 指对象本身,然后噼里啪啦说一堆,然后听完的你,仍然完全搞不清楚,什么时候变量前需要 ...

  3. python 怎么模拟加header(如User-Agent、Content-Type等等)

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python 怎么模拟加header(如User-Agent.Content-Type等等) #办法一: i ...

  4. SpringMVC路径问题回顾,加斜杠和不加斜杠的问题(六)

    绝对路径:全的路径. 相对路径:有参照的路径. 加斜杠和不加斜杠的问题如下:(分前台和后台路径,明白这两个就知道什么意思了) 如果是页面,这个图片路径出现在jsp页面,所以是前台路径,前台路径的参照物 ...

  5. python列表可以加可以乘

    python列表可以加可以乘 list=['abcd',786,2.23,'runoob',70.2] tinylist = [123,'runoob'] print(list) print(list ...

  6. jquery 调用函数时加()和不加()的执行顺序是不同的

    编写JQUERY(3.0,向下兼容3.0)代码当我们调用一个函数时可以不加括号,但加括号与不加括号是不同的.如下代码: $(function(){ a(b);//先打印a 再打印 b a(b());/ ...

  7. mysql加单引号和不加单引号的性能比较

    刚刚我们说过了,生活中难免会有一些不如意,比如,我们用一个字符串类型的字段来作为主键,表面上,这太不如意了,然而,事实也证明这是有用的.问题也就出来了,当在查询语句中对该字段值加上单引号和不加查询耗时 ...

  8. python 如何重新加载有修改过的模块(module)

    写 Python 程序的时候,一边写模块一边调试.调试是在 Python 自身的命令行终端进行的.但当对模块里的代码进行修改后,在原调试终端上执行到模块中新修改上去的内容. 我之前是一直用退出再重新进 ...

  9. 利用python进行数据加载和存储

    1.文本文件 (1)pd.read_csv加载分隔符为逗号的数据:pd.read_table从文件.URL.文件型对象中加载带分隔符的数据.默认为制表符.(加载为DataFrame结构) 参数name ...

随机推荐

  1. 关于ionic2打包android时gradle下载不了的解决方法(附:简单优化启动速度彩蛋)

    问题 之前在使用ionic2时使用建立android平台命令或者编译时,总是会在获取gradle时卡住,等很久进度也不变化,导致命令超时失败.于是经过查阅资料和自己实践测试,总结出以下办法. 方法 其 ...

  2. .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)

    .NET语言的编译分为两个阶段.首先高级语言被编译成一种称作IL的中间语言,与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念(比如:类.异常),这也是这种语言被称为中间语言的原因.IL ...

  3. JSON序列——保存修改数据

    JSON序列——保存修改数据 procedure TForm1.Button6Click(Sender: TObject); begin var delta: TynJsonDelta := TynJ ...

  4. .net core使用数据库

    .net core使用数据库 .net core 通过可以通过ef core或其它ORM框架进行数据访问.此处使用EF和Dapper作为示例. 使用EF Core访问数据库 与 .NET Framew ...

  5. [rtsp]海康IPC监控摄像头远程外网监控配置(DDNS)

        本来这个DDNS服务正是我想要的,但是配置了之后海康提示不再提供这个服务了,以后统一使用萤石云了,看来有必要去学习下萤石开放平台的api,看都提供哪些服务. 海康威视网络摄像机出厂的默认IP地 ...

  6. html学习笔记之2——多媒体

    一:插件 插件可以通过 <object> 标签或者 <embed> 标签添加在页面中. <object width="400" height=&quo ...

  7. kuda 了解片

    本来上个月想去了解一下kuda的,结果一直没有抽出时间去搞,现在大致先开个头,方便后面深入! Apache Kudu是开源Apache Hadoop生态系统的新成员,它完善了Hadoop的存储层,可以 ...

  8. 读吴恩达算-EM算法笔记

    最近感觉对EM算法有一点遗忘,在表述的时候,还是有一点说不清,于是重新去看了这篇<CS229 Lecture notes>笔记. 于是有了这篇小札. 关于Jensen's inequali ...

  9. 修改Linux用户配置之后先验证再退出

    在服务器上更改完zsh.SSH连接属性.用户密码之后,我们可能想退出重新登录查看是否配置生效.这时,有一个注意事项:不要关闭旧窗口,而是重新打开一个新窗口尝试登录.否则,如果配置改错了,自己就再也没有 ...

  10. MySQL技术内幕读书笔记(七)——锁

    锁 ​ 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch ​ 使用命令 ...