为什么有些函数在函数名前后都有下划线“__”(python underscore before function name)

这种“强调”似乎发生了很多,我想知道这是 Python 语言的要求,还是仅仅是惯例?

这种“强调”似乎发生了很多,我想知道这是 Python 语言的要求,还是仅仅是惯例?

此外,有人可以命名和解释哪些功能往往有下划线,以及为什么(__init__,例如)?

718

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 本身保留的:“永远不要发明这样的名称;只使用它们作为记录。

78

其他受访者将双前导和尾随下划线描述为“特殊”或“魔术”方法的命名约定是正确的。

虽然您可以直接调用这些方法(例如[10, 20].__len__()),但下划线的存在暗示这些方法旨在间接调用(例如len([10, 20]))。大多数 python 运算符都具有关联的“魔术”方法(例如,a[x]是调用a.__getitem__(x)的常用方法)。

29

用双下划线包围的名称对 Python 来说是“特殊的”。它们列在Python Language Reference, section 3, "Data model"中。

6

实际上,当我需要在父类和子类名称之间有所不同时,我使用_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)
    )

...

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(308)
NodeXL-没有边的节点
上一篇
如何在PHP中获取连接的客户端的MAC和IP地址
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(44条)