本文主要是介绍Python——详解__slots__,property与代码规范,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是Python专题的第11篇文章,我们来聊聊面向对象的一些进阶使用。
__slots__
如果你看过github当中一些大牛的代码,你会发现很多大牛经常在类的顶部加上__slots__关键字。如果你足够好奇,你可能会试着把这个关键字去掉再运行试试,你会发现去掉了之后什么也没有发生,一切依然运行得很好。
那么这个__slots__关键字究竟是做什么的呢?
它主要有两个功能,我们先来说第一个功能,就是限制用户的使用。
我们都知道Python是一门非常灵活的动态语言,很多在其他语言看起来完全不能容忍的事情在Python当中是可行的,这也是Python的设计理念,为了灵活和代码方便牺牲了效率。比如我们来看一个很简单的例子,由于Python是动态语言,所以类的成员甚至可以在类创建好了之后动态创建。这在静态语言当中是绝对不行的,我们只能调用类当中已有的属性,是不能或者很难添加新属性的。
比如这段代码:
class Exp:def __init__(self):self.a = Noneself.b = Noneif __name__ == "__main__":exp = Exp()exp.c = 3print(exp.c)
我们定义了一个类叫做Exp,我们为它创建了a和b两个成员。但是我们在使用的时候,对c成员进行了赋值。要知道Exp类当中是没有成员c的,但是程序并不会报错,我们这么运行了之后它会将c添加进这个实例当中。
从一方面来看,这当然非常灵活,但是另一方面,这也留下了隐患。如果用户随意添加属性,可能会导致未知的问题,尤其在复杂的系统当中。所以有些时候为了严谨,我们会不希望用户做这种动态的修改。__slots__正是用来做这个的。
我们把这个关键字加上,再来运行结果就不一样了:
class Exp:__slots__ = ['a', 'b']def __init__(self):self.a = Noneself.b = Noneif __name__ == "__main__":exp = Exp()exp.c
这篇关于Python——详解__slots__,property与代码规范的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!