区分Python 下划线作为变量前缀和后缀(_, __ , __xx__)

原创 tiangr  2016-12-25 18:41  阅读 172 次

在调试程序的时候出现了错误:

RecursionError: maximum recursion depth exceeded

原因是我类中使用了Python的@property来绑定类属性。

  1.     @property
  2.     def prefix(self):
  3.         return self.prefix
  4.     @prefix.setter
  5.     def prefix(self, prefix):
  6.         if isinstance(prefix, str):
  7.             self.prefix = prefix
  8.         else:
  9.             raise ValueError('The table prefix must be string type.')

就是这段代码发生了死循环,仔细看了一下,发现如果你的类实例化后给这个属性赋值时是不会有问题的,但是如果在类的内部有其他方法使用self.prefix获取这个属性,那么,每次调用self.prefix都会在return self.prefix再次执行方法prefix,导致了死循环。

那么解决的办法只有将return self.prefix中的变量名改为其他,这里比较通用的方法是添加_或者__改成私有变量属性。接下来解释下Python 下划线作为变量前缀和后缀(_, __ , __xx__)有什么不同?

Python 用下划线作为变量前缀和后缀指定特殊变量。

_xxx 不能用'from module import *'导入
__xxx__ 系统定义名字
__xxx 类中的私有变量名

核心风格:避免用下划线作为变量名的开始。

因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。

"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
"双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

结论:

1、_xxx 不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。

2、__xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以。

3、__xxx___定义的是特列方法。像__init__之类的。

特别提示:本站资源全部免费下载,因服务器需经费维护,文中部分外链点击后会进入广告,请耐心等待5秒即可跳过广告进入目标页面。如遇页面外链打不开或下载地址失效,您可以在评论中指出错误,或扫描页面底部二维码。
本文地址:http://www.tiangr.com/qu-fen-python-xia-hua-xian-zuo-wei-bian-liang-qian-zhui-he-hou-zhui-xx.html
版权声明:本文为原创文章,版权归 tiangr 所有,欢迎分享本文,转载请保留出处!

发表评论


表情