python高级编程之选择好名称:pepe8和命名最佳实践,,##-*-codin
python高级编程之选择好名称:pepe8和命名最佳实践,,##-*-codin
##-*-coding:utf-8-*-
##python:2.x
#__author__=‘Administrator‘
#my_list=[‘a‘,‘b‘,‘c‘,‘d‘]
#"""
#大部分标准程序加在构建时都不会忽略可用性,看下面的例子理解下这句话的含义
#"""
#if‘e‘notinmy_list:
#my_list.append(‘e‘)
#printmy_list
##[‘a‘,‘b‘,‘c‘,‘d‘,‘e‘]
##这是编写python程序和其他语言相比更加简单的原因之王,当编写一段程序时,思路很快就能够转换为代码行
##3点是本章的重点
#"""
#使用pep8中描述的命名约定,以及一组命名最佳实践
#命名空间重构
#使用API,从初始模型到其重构模型
#"""
##pepe8和命名最佳实践:地址:www.python.org/dev/peps/pepe-008,提供了一些与编码风格相关的指南
##不同的命名风格包括
#"""
#CamelCase(每个单词首字母大写)
#minedCase与CamelCase类似,但是第一个单词的首字母仍然为小写
#UPPERCASE(大写),和ER_CASE_WITH_UNDERSCORES(大写并且带下划线)
#lowercase(小写)和lower_case_with_underscores(小写并且带下划线)
#前缀(_leading)和后缀(trailing_)下划线或者都加下划线(__doubled__)
#小写和大写元素通常是一个单词,使用下划线通常是缩写词,使用单词会更好一些,前缀和后缀用来标记私有和特殊元素
#"""
##变量
##常量:不会出现变化的全局变量,使用大写和一个下划线,告诉我们开发人员指定的变量表示一个恒定值
##注意:在python里面没有真正的常量-c++用const定义那种常量,任何变量都可以修改,这就是python使用命名约定来将一个变量标记为常量的原因
#"""
#例如,doctest模块提供了一个选项标志和指令的列表(参考http://docs.python.org/lib/doctest-options.html)
#"""
#fromdoctestimportIGNORE_EXCEPTION_DETAIL,REPORT_ONLY_FIRST_FAILURE
##虽然变量名看上去相当长,是清晰的描述了它们很重要,基本上都在初始化代码中使用它们,而不会在代码本身主体中使用,所以冗长名称并不会令人厌烦
##大部分的情况,缩写名称会使代码变得模糊,在缩写名称不够清晰时,不要害怕使用完整的语句
##一些常量的名称也是基于低层技术派生的,例如
#importos
#try:
#os._exit(0)
#exceptos.EX_SOFTWARE:
#print‘interanlsortwarerror‘
#raise
##使用常量时,将它们集中放在模块头部是一个好办法,当用于如下操作时,应该将其组合在新的变量之下
#TeSt_optinos=(Ellipsis|IGNORE_EXCEPTION_DETAIL|REPORT_ONLY_FIRST_FAILURE)
##命名和使用
##常量用来定义一组程序所依赖的值,如默认配置文件名称,将所有常量集中放在包中独立文件中是一种好办法
##config.py
#SQL_USER=‘tarek‘
#SQL_PASSWORD=‘secret‘
#SQL_URL=‘postgres://%s:%s@localhost/db‘%(SQL_USER,SQL_PASSWORD)
#MAX_THREADS=4
##另一种方法是使用ConfigParser或者ZConfig(高级)之类的模块工具(用于ZOPE中描述其配置文件解析器)解析配置文件,在python这样程序文件能够像文本文件一样易于编辑和修改语言,采用这样方法是对另一种文件格式过度使用
##对于表现的像标志选项,将它们和布尔操作组合是一种好的方法,就像doctest和re模块,如下
#OPTIONS={}
#defreg(name):
#returnOPTIONS.setdefault(name,1<<len(OPTIONS))
#defhasg(options,name):
#returnbool(options&name)
##现在定义选项
#A=reg(‘A‘)
#B=reg(‘B‘)
#C=reg(‘C‘)
#
##然后尝试它们
#s=A|B
#printhasg(s,A)
##当创建这样一组新的常量时,应该避免使用常量为前缀,除非模块中很多个组,模块名本身就一个常见的前缀
#"""在python中,使用二进制逐位计算来组合选项是常用见方法,使用或(|)操作符可以将多个选项组合在一个整数中,而使用与(&)操作符能够检查整数中的选项,参考上面的hasg函数
#如果这个整数可以使用<<操作符移位,以确保和组合得到整数中的另一个不相同,那就起作用,换句话说,它是2的幂(参考reg)
#"""
##公有和私有变量
##对于易变和仅有全局变量,当它们需要被保护时应该使用小写和一个下划线,但是这样的变量不常用,因为在需要保护时,模块通常会提供gettert,setter来处理它们,在这样的情况下,一个前导下划线表示该变量为包的私有元素,如下:
#_bao=[]
#defadd_bao(bao):
#_bao.append(bao)
#defget_bao():
#‘‘‘makessure_baocannotbemodified.‘‘‘
#returntuple(_bao)
##位于函数和方法中变量遵循相同的规则,并且永远不会被标志为私有,因为它们对上下文来说是局部的
##对于类或者实例变量而言,只要将变量作为公共签名一部分同,并且不能带来任何有用的信息或者冗余情况下才必须使用私有标志(即前导下划线)
##换锯话说,如果该变量在方法内部使用,用来提供一个公共特性,并且只扮演这个角色,最好将共声明为私有,如下
##只支持一个属性的是好的私有成员
#classC(object):
#def__init__(self):
#self._message=‘go‘
#def_get_mess(self):
#returnself._message
#kane=property(_get_mess)
#
#printC().kane
##另一个例子是用来保持内部状态的变量,这个值对于余下代码没有用处,但是它参与类的行为,如下
#classM(object):
#def__init__(self):
#self._peple_to_kill=[]
#defis_slapped_on_the_button_by(self,ane):
#self._peple_to_kill.append(ane)
#print‘ouch!‘
#defreveget(self):
#print‘10yearlater...‘
#forpinself._peple_to_kill:
#print‘%s‘%p
#a=M()
#printa.is_slapped_on_the_button_by(‘tarek‘)
#printa.reveget()
##不要轻易断言类进行子类化时可用采用的方式
##函数和方法
##命名时应该使用小写和下划线,但是在标准程序库中并不是总遵守这个规则,可以找到一些使用混合大小写(mixedCase)模块,使用threading中的currentThread(这在python3000中可能会发生改变)
##这样的编写方法的方式在小写范式成为标准之前很常见,诸如Zope之类的框架也使用了混合大小写的方法,使用它开发人员群体相当大,所以在混合大小写和小写加下划线之间做什么选择,主要取决于所使用的程序库
##在这样的类型程序库环境中,最正统的方法只对被输出到框架中的元素和混合大小写,其他代码保持作pep风格
##1关于私有元素的争论
#"""
#对于私有方法和函数而言,命名惯性是添加一个前导下划线,考虑到python名称改编特性,这个规则是相当有争议的,当方法有2个前导下划线时,解释程序会立即对其更名,以避免和子类中的方法产生冲突
#如下
#"""
classBase(object):
def__secret(self):
print‘1‘
defpublic(self):
self.__secret()
##printBase.__secret()AttributeError:typeobject‘Base‘hasnoattribute‘__secret‘
printdir(Base)
classB1(Base):
def__secret(self):
print‘newver‘
B1().public()
#python中设计名称改编(namemailing)的原始动机是不提供类似c++中私有机关(gimmick),而是用来确保一些基类隐式的避免子类中的关窗,尤其在多重继承环境中,但是如果针对每个特性都使用它,就会使代码变得模糊不清,这根本不是python风格
#有些人认为应该始终使用显式名称,改编,如下,_a(self)另这样做
classAA(object):
def_a(self):
pass
#该类将在整个代码中不断重复,因为__是首选的
#正如BDFL(GUIDO,BENEVLOENTDICTATORFORLIFE,参考:en.wikipedia.org/wiki/BDFL)所说,是通过在子类中编写方法之前查看__mro__来避免名称改编,改变基类的私有方法必须小心进行
#具体可以看下http://mail.python.org/pipermail/python-dev/2005-December/058555.html上查找
#BENEVLOENTDICTATORFORLIFE(即仁慈大帝)
#特殊方法:docs.python.org/ref/specialnames.html,是以2个下划线开始和结束的,常规方法不应该使用这种命名约定,被用于操作符重载等,如下
classW(int):
def__add__(self,other):
returnint.__add__(self,other)+1
def__repr__(self):
return‘weibor%d‘%self
#
#公有api
#
defdo_this(self):
print‘this‘
defdo_that(self):
print‘that‘
#对于常用的方法,绝不应该使用这种名称,所以不要创建如下名称方法;
classBa(object):
def__my_methond__(self):
pass
#参数:使用小写,如果需要的话可以加上下划线,它们遵守与变量相同命名规则
#属性用小写或者小写加上下划线命名的,大部分的时候,表示对象的状态,可以是一个名词或者形容词,在需要的时候可以也是小短语,如下
classCoi(object):
_c=[]
defv(self,a):
self._c.append(a)
def_cc(self):
return‘‘.join(self._c)
connect=property(_cc)
aa=Coi()
aa.v(‘tt‘)
#类的名称问题是使用CamelCase格式命名,当定义是模块的私有类是,还可能有一个前导下划线
#类和实例变量常常是名词短语,其使用逻辑与用动词短语命名方法一致,如下
classDS(object):
defope(self):
pass
classUSER(object):
pass
a=USER()
db=DS()
db.ope()
#模块和名
#除了特殊模块__init__之外,模块名称都使用不带下划线的小写字母命名,如下
"""
os,sys,shbutil
当模块对于包而言是私有的时候,将添加一个前导下划线,编译过c或者c++模块名称通常带有一个下划线并且将导入到纯python模块中
包遵守相同规则,因为它们在命名空间中表现和模块类似
"""
python高级编程之选择好名称:pepe8和命名最佳实践
评论关闭