Python 高手编程系列四百三十七 :函数和方法

函数和方法的名称应该使用小写加下划线。但在旧的标准库模块中并不总是这样。
Python 3 对标准库做了大量重组,所以大多数函数和方法都有一致的大小写。不过对于某
些模块(例如 threading)而言,你可以访问使用混合大小写(mixedCase)的旧的函数
名称(例如 currentThread)。留着它们是为了更容易向后兼容,但如果你不需要在旧版
Python 中运行代码,那么应该避免使用这些旧的名称。
这种方法的写法在小写范式成为标准之前很常见,一些框架(例如 Zope 和 Twisted)
对方法也使用混合大小写。使用它的开发者社区仍然相当多。因此,选择混合大小写还是
小写加下划线,这取决于你所使用的库。
作为 Zope 的开发人员,保持一致性并不容易,因为构建一个混合纯 Python 模块和导
入了 Zope 代码的模块的应用程序很困难。在 Zope 中,有一些类混用了两种约定,因为代
码库仍在发展,而 Zope 开发人员想要采用多数人都接受的常用约定。
在这种类型的程序库环境中,得体的做法是只对暴露到框架中的元素使用混合大小写,
而其他代码保持遵守 PEP 8 风格。
还值得注意的是,Twisted 项目的开发人员采用一种完全不同的方法来解决这个问题。
与 Zope 一样,Twisted 项目早于 PEP 8 文档。项目启动时没有任何代码风格的官方指南,所
以它有自己的风格指南。关于缩进、文档字符串、每行长度等风格规则可以很容易被采用。
另一方面,修改所有代码以匹配 PEP 8 的命名约定,可能会完全破坏向后兼容。对于像 Twisted
这样的大型项目而言,这么做并不可行。因此 Twisted 尽可能遵守 PEP 8,并将其余内容(例
如变量、函数和方面的混合大小写)作为它自己的编码标准的一部分。这与 PEP 8 的建议完
全兼容,因为它特别强调,在项目内的一致性比遵守 PEP 8 风格指南要更加重要。
关于私有元素的争论
对于私有方法和函数,惯例是添加一个前缀下划线。考虑到 Python 中的名称修饰
(name-mangling)特性,这条规则是相当有争议的。如果一个方法有两个前缀下划线,它
会在运行时被解释器重命名,以避免与任何子类中的方法产生命名冲突。
因此,有些人倾向于对私有属性使用双前缀下划线,以避免子类中的命名冲突:
class Base(object):
def __secret(self):
print(“don’t tell”)
def public(self):
self.__secret()
class Derived(Base):
def __secret(self):
print(“never ever”)
你将会看到以下内容:

Base. __secret
Traceback (most recent call last):
File “”, line 1, in
AttributeError: type object ‘Base’ has no attribute ’ _secret’
dir(Base)
[’
Base secret’, …, ‘public’]
Derived().public()
don’t tell
Python 中名称修饰的最初目的不是提供类似 C++的私有花招(gimmick),而是用来确
保某些基类隐式地避免子类中的冲突,特别是在多重继承的上下文中。但将其用于每个属
性则会使私有代码含义变得模糊,这一点也不 Pythonic。
因此,有些人认为应该始终使用显式的名称修饰:
class Base:
def Base_secret(self): # 不要这么做!!!
print(“you told it ?”)
这样会在所有代码中重复类名,所以应该首选

但正如 BDFL(Guido,the Benevolent Dictator For Life,参见 http://en.wikipedia.org/wiki/
BDFL)所说,最佳做法是在编写子类中的方法之前查看该类的__mro
(方法解析顺序)
值,从而避免使用名称修饰。修改基类的私有方法一定要小心。
关于这个主题的更多信息,许多年前在 Python-Dev 邮件列表中出现过一个有趣的讨论,
人们争论名称修饰的实用性以及它在这门语言中的命运。你可以访问地网址:
http://mail.python.org/ pipermail/python-dev/2005-December/058555.html 查看。
特殊方法
特殊方法(https://docs.python.org/3/reference/datamodel.html#special-method-names)以
双下划线开始和结束,常规的方法不应该使用这种约定。有些开发者曾经将其称为 dunder
方法,作为双下划线(double-underscore)的合成词。它们可用于运算符重载、容器定义等方面。为了保证可读性,它们应该集中放在类定义的开头:
class WeirdInt(int):
def add(self, other):
return int.add(self, other) + 1
def repr(self):
return ‘<weirdo %d>’ % self

公共 API

def do_this(self):
print(‘this’)
def do_that(self):
print(‘that’)
对于常规方法而言,你永远不应该使用这种名称。所以不要为方法创建这样的名称:
class BadHabits:
def my_method(self):
print(‘ok’)
参数
参数名称使用小写,如果需要的话可以加下划线。它们遵循与变量相同的命名规则。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值