这种“强调”似乎发生了很多,我想知道这是 Python 语言的要求,还是仅仅是惯例?
此外,有人可以命名和解释哪些功能往往有下划线,以及为什么(__init__
,例如)?
从Python PEP 8 -- Style Guide for Python Code:
Descriptive:Naming Styles可以识别以下使用前导或尾随下划线的特殊形式(这些形式通常可以与任何大小写约定结合使用):
_single_leading_underscore
:弱“内部使用”指示器。例如from M import *
不导入名称以下划线开头的对象。
single_trailing_underscore_
:由约定使用,以避免与 Python 关键字冲突,例如
Tkinter.Toplevel(master,class_='ClassName')
__double_leading_underscore
:在命名类属性时,调用名称 mangling(在类 FooBar 中,__boo
变为_FooBar__boo
;见下文)。
__double_leading_and_trailing_underscore__
:存在于用户控制的命名空间中的“魔术”对象或属性。例如__init__
,__import__
或__file__
。永远不要发明这样的名称;只按记录使用它们。
请注意,带有双前导和尾随下划线的名称基本上是为 Python 本身保留的:“永远不要发明这样的名称;只使用它们作为记录。
其他受访者将双前导和尾随下划线描述为“特殊”或“魔术”方法的命名约定是正确的。
虽然您可以直接调用这些方法(例如[10, 20].__len__()
),但下划线的存在暗示这些方法旨在间接调用(例如len([10, 20])
)。大多数 python 运算符都具有关联的“魔术”方法(例如,a[x]
是调用a.__getitem__(x)
的常用方法)。
用双下划线包围的名称对 Python 来说是“特殊的”。它们列在Python Language Reference, section 3, "Data model"中。
实际上,当我需要在父类和子类名称之间有所不同时,我使用_method 名称。我读过一些使用这种方式创建父子类的代码。作为一个例子,我可以提供这个代码:
class ThreadableMixin:
def start_worker(self):
threading.Thread(target=self.worker).start()
def worker(self):
try:
self._worker()
except tornado.web.HTTPError, e:
self.set_status(e.status_code)
except:
logging.error("_worker problem", exc_info=True)
self.set_status(500)
tornado.ioloop.IOLoop.instance().add_callback(self.async_callback(self.results))
...
和具有_worker 方法的孩子
class Handler(tornado.web.RequestHandler, ThreadableMixin):
def _worker(self):
self.res = self.render_string("template.html",
title = _("Title"),
data = self.application.db.query("select ... where object_id=%s", self.object_id)
)
...
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(44条)