标签:
命名风格
一、变量命名
python 中有两种变量:
■ 常量.
■ 公有和私有变量.
1.1 常量
对于值不会发生改变的全局变量使用大写和个下划线, 它告诉开发人员制定的变量代表一个恒定值, 常量常用来定义一组程序所依赖的值, 如默认配置文件名称.
from doctest import IGNORE_EXCEPTIOON_DETALL from doctest import REPORT_ONLY_FIRST_FAILURE
如果常量过多可以采用下列几种方式来管理:
(1) 将他们集中放在模块头部.
(2) 将所有常量集中放在包中的独立文件中( Django 采用的就是这种方式)
# config.py SQL_USER = ‘tarek‘ SQL_PASSWORD = ‘secret‘ SQL_URI = ‘postgres://%s:%s@localhost/db‘ % (SQL_USER, SQL_PASSWORD) MAX_THREADS = 4
(3) 使用可以被 ConfigParser 模块或者像 ZConfig 之类的高级工具解析的配置文件.
1.2 公有和私有变量
对于易变和公有的全局变量,当它们需要被保护时应该使用小写和下划线. 但是这种变量不常使用, 因为在需求保护时, 模块通常会提供 getter 和 setter 来处理它们. 在这种情况下, 一个前导下划线可以表示该变量为包的私有元素.
_observers = [] def add_observer(observer): _observers.append(observer) def get_observers(): """Makes sure _observers cannot be modified.""" return tuple(_observers)
位于函数和方法中的变量遵循相同的规则, 并且永远不会被标志为私有,因为他们对上下文来说是局部的. 对于类或实例变量而言, 只在将变量作为公共签名的一部分, 并且不能带来任何有用的信息或冗余的情况下才必须使用私有标志.
简单来说, 如果该变量是在方法内部使用, 用来提供一个公共特性, 并且只扮演这个角色, 那么最好是将其声明为私有变量.
例如, 只支持一个属性的特性是好的私有成员.
class Citizen(object): def __init__(self): self._message = ‘Go boys‘ def _get_message(self): return self._message kane = property(_get_message) print Citizen().kane # output: ‘Go boys‘
另外一个例子是用来保持内部状态的变量. 这个指对余下的代码没有用处,但是它参与了类的行为.
class MeanElephant(object): def __init__(self): self._people_to_kill = [] def is_slapped_on_the_butt_by(self, name): self._people_to_kill.append(name) print ‘Ouch!‘ def revenge(self): print ‘10 years later...‘ for person in self._people_to_kill: print ‘Me kill %s‘ % person joe = MeanElephant() joe.is_slapped_on_the_butt_by(‘Tarek‘) # output: Ouch! joe.is_slapped_on_the_butt_by(‘Bill‘) # output: Ouch! joe.revenge() ‘‘‘ output: 10 years later... Me kill Tarek Me kill Bill ‘‘‘
二、函数和方法命名
函数和方法命名时应该使用小写和下划线. 但是在标准程序库中并不总是遵循这个规则.可能还有使用大小写(驼峰命名法)的模式.
2.1 关于私有元素的争论
对于私有的方法和函数而言, 命名惯例是添加一个前导下划线. 考虑到 python 的名称改编特性,这个规则是相当有争议的.当方法有两个前导下划线时,解释程序会立即对齐更名,以避免和子类中的方法产生冲突.
所以有些人倾向于对其私有的特性使用双前导下划线,以避免子类中的命名冲突.
class Base(object): def __secret(self): print "don‘t tell" def public(self): self.__secret() # Base.__secret ‘‘‘ output: Traceback (most recent call last): File "E:\MyEclipse2014\qfs 2.0\src\test.py", line 6, in <module> Base.__secret AttributeError: type object ‘Base‘ has no attribute ‘__secret‘ ‘‘‘ print dir(Base) # output: [‘_Base__secret‘, ..., ‘public‘] class Derived(Base): def __secret(self): print "never ever" Derived().public() # output: don‘t tell
2.2 特殊的方法
特殊方法是以两个下划线开始和结束的, 常规方法不应该使用这种命名约定. 他们被用于操作符重载、容器定义等. 为了使程序易读,它们应该被击中放在类定义的最前面.
class weidint(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_thar(self): print ‘that‘
对于常规的方法,绝不应该使用这种名称,所以不要创建诸如一下这种方法名称.
class BadHabits(object): def __my_method__(self): print ‘ok‘
2.3 参数
参数使用小写,如果需要的话可以加上下划线.它们遵循与变量相同的命名规则.
三、属性
属性名称是用小写或者小写加上下划线命名的. 大部分的时候, 它们表示对象的状态, 可以是一个名字或一个形容词, 在需要的时候也可以是一个小短语.
class Connection(object):
_connected = []
def connect(self, user):
self._connected.append(user)
def _connected_people(self):
return ‘\n‘.join(self._connected)
connected_people = property(_connected_people)
my = Connection()
my.connect(‘Tarek‘)
my.connect(‘Shannon‘)
print my.connected_people
‘‘‘
output:
Tarek
Shannon
‘‘‘
四、类
类的名称总是使用 CamelCase 格式命名, 当定义的是模块的私有类时,还可能有一个前导下划线.
类和实例变量常常时名词短语, 其使用逻辑与用动词短语命名方法一致.
class Database(object):
def open(self):
pass
class User(object):
pass
user = User()
db = Database()
db.open()
五、模块和包
除了特殊模块 __init__ 之外, 模块名称都使用不带下划线的小写字母命名. 如 os,sys,shutil.
8.
标签:
原文地址:http://www.cnblogs.com/mydevops/p/4515285.html