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