python高级编程之选择好名称:pepe8和命名最佳实践

# # -*- coding: utf-8 -*-

# # python:2.x

# __author__ = ‘Administrator‘

# my_list=[‘a‘,‘b‘,‘c‘,‘d‘]

# """

# 大部分标准程序加在构建时都不会忽略可用性,看下面的例子理解下这句话的含义

# """

# if ‘e‘ not in my_list:

#     my_list.append(‘e‘)

# print my_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)

# """

# from doctest import IGNORE_EXCEPTION_DETAIL,REPORT_ONLY_FIRST_FAILURE

# #虽然变量名看上去相当长,是清晰的描述了它们很重要,基本上都在初始化代码中使用它们,而不会在代码本身主体中使用,所以冗长名称并不会令人厌烦

# #大部分的情况,缩写名称会使代码变得模糊,在缩写名称不够清晰时,不要害怕使用完整的语句

# #一些常量的名称也是基于低层技术派生的,例如

# import os

# try:

#     os._exit(0)

# except os.EX_SOFTWARE:

#     print ‘interanl sortwar error‘

#     raise

# #使用常量时,将它们集中放在模块头部是一个好办法,当用于如下操作时,应该将其组合在新的变量之下

# TeSt_optinos=(Ellipsis|IGNORE_EXCEPTION_DETAIL|REPORT_ONLY_FIRST_FAILURE)

# #命名和使用

# #常量用来定义一组程序所依赖的值,如默认配置文件名称,将所有常量集中放在包中独立文件中是一种好办法

# #config.py

# SQL_USER=‘tarek‘

# SQL_PASSWORD=‘secret‘

# SQL_URL=‘postgres://%s:%[email protected]/db‘%(SQL_USER,SQL_PASSWORD)

# MAX_THREADS=4

# #另一种方法是使用ConfigParser或者ZConfig(高级)之类的模块工具(用于ZOPE中描述其配置文件解析器)解析配置文件,在python这样程序文件能够像文本文件一样易于编辑和修改语言,采用这样方法是对另一种文件格式过度使用

# #对于表现的像标志选项,将它们和布尔操作组合是一种好的方法,就像doctest和re模块,如下

# OPTIONS={}

# def reg(name):

#     return OPTIONS.setdefault(name,1<<len(OPTIONS))

# def hasg(options,name):

#     return bool(options&name)

# #现在定义选项

# A=reg(‘A‘)

# B=reg(‘B‘)

# C=reg(‘C‘)

#

# #然后尝试它们

# s=A|B

# print hasg(s,A)

# #当创建这样一组新的常量时,应该避免使用常量为前缀,除非模块中很多个组,模块名本身就一个常见的前缀

# """在python中,使用二进制逐位计算来组合选项是常用见方法,使用或(|)操作符可以将多个选项组合在一个整数中,而使用与(&)操作符能够检查整数中的选项,参考上面的hasg函数

# 如果这个整数可以使用<<操作符移位,以确保和组合得到整数中的另一个不相同,那就起作用,换句话说,它是2的幂(参考reg)

# """

# #公有和私有变量

# #对于易变和仅有全局变量,当它们需要被保护时应该使用小写和一个下划线,但是这样的变量不常用,因为在需要保护时,模块通常会提供gettert,setter来处理它们,在这样的情况下,一个前导下划线表示该变量为包的私有元素,如下:

# _bao=[]

# def add_bao(bao):

#     _bao.append(bao)

# def get_bao():

#     ‘‘‘makes sure _bao cannot be modified.‘‘‘

#     return tuple(_bao)

# #位于函数和方法中变量遵循相同的规则,并且永远不会被标志为私有,因为它们对上下文来说是局部的

# #对于类或者实例变量而言,只要将变量作为公共签名一部分同,并且不能带来任何有用的信息或者冗余情况下才必须使用私有标志(即前导下划线)

# #换锯话说,如果该变量在方法内部使用,用来提供一个公共特性,并且只扮演这个角色,最好将共声明为私有,如下

# #只支持一个属性的是好的私有成员

# class C(object):

#     def __init__(self):

#         self._message=‘go‘

#     def _get_mess(self):

#         return  self._message

#     kane=property(_get_mess)

#

# print C().kane

# #另一个例子是用来保持内部状态的变量,这个值对于余下代码没有用处,但是它参与类的行为,如下

# class M(object):

#     def __init__(self):

#         self._peple_to_kill=[]

#     def is_slapped_on_the_button_by(self,ane):

#         self._peple_to_kill.append(ane)

#         print ‘ouch!‘

#     def reveget(self):

#         print ‘10 year later...‘

#         for p in self._peple_to_kill:

#             print ‘%s‘%p

# a=M()

# print a.is_slapped_on_the_button_by(‘tarek‘)

# print a.reveget()

# #不要轻易断言类进行子类化时可用采用的方式

# #函数和方法

# #命名时应该使用小写和下划线,但是在标准程序库中并不是总遵守这个规则,可以找到一些使用混合大小写(mixedCase)模块,使用threading中的currentThread(这在python3000中可能会发生改变)

# #这样的编写方法的方式在小写范式成为标准之前很常见,诸如Zope之类的框架也使用了混合大小写的方法,使用它开发人员群体相当大,所以在混合大小写和小写加下划线之间做什么选择,主要取决于所使用的程序库

# #在这样的类型程序库环境中,最正统的方法只对被输出到框架中的元素和混合大小写,其他代码保持作pep风格

# #1关于私有元素的争论

# """

# 对于私有方法和函数而言,命名惯性是添加一个前导下划线,考虑到python名称改编特性,这个规则是相当有争议的,当方法有2个前导下划线时,解释程序会立即对其更名,以避免和子类中的方法产生冲突

# 如下

# """

class Base(object):

def __secret(self):

print ‘1‘

def public(self):

self.__secret()

# #print Base.__secret()AttributeError: type object ‘Base‘ has no attribute ‘__secret‘

print dir(Base)

class B1(Base):

def __secret(self):

print ‘new ver‘

B1().public()

#python中设计名称改编(name mailing)的原始动机是不提供类似c++中私有机关(gimmick),而是用来确保一些基类隐式的避免子类中的关窗,尤其在多重继承环境中,但是如果针对每个特性都使用它,就会使代码变得模糊不清,这根本不是python风格

#有些人认为应该始终使用显式名称,改编,如下,_a(self)另这样做

class AA(object):

def _a(self):

pass

#该类将在整个代码中不断重复,因为__是首选的

#正如BDFL(GUIDO,BENEVLOENT DICTATOR FOR LIFE,参考:en.wikipedia.org/wiki/BDFL)所说,是通过在子类中编写方法之前查看__mro__来避免名称改编,改变基类的私有方法必须小心进行

#具体可以看下http://mail.python.org/pipermail/python-dev/2005-December/058555.html上查找

#BENEVLOENT DICTATOR FOR LIFE(即仁慈大帝)

#特殊方法:docs.python.org/ref/specialnames.html,是以2个下划线开始和结束的,常规方法不应该使用这种命名约定,被用于操作符重载等,如下

class W(int):

def __add__(self, other):

return int.__add__(self,other)+1

def __repr__(self):

return‘weibor%d‘%self

#

#公有api

#

def do_this(self):

print ‘this‘

def do_that(self):

print ‘that‘

#对于常用的方法,绝不应该使用这种名称,所以不要创建如下名称方法;

class Ba(object):

def __my_methond__(self):

pass

#参数:使用小写,如果需要的话可以加上下划线,它们遵守与变量相同命名规则

#属性用小写或者小写加上下划线命名的,大部分的时候,表示对象的状态,可以是一个名词或者形容词,在需要的时候可以也是小短语,如下

class Coi(object):

_c=[]

def v(self,a):

self._c.append(a)

def _cc(self):

return ‘‘.join(self._c)

connect=property(_cc)

aa=Coi()

aa.v(‘tt‘)

#类的名称问题是使用CamelCase格式命名,当定义是模块的私有类是,还可能有一个前导下划线

#类和实例变量常常是名词短语,其使用逻辑与用动词短语命名方法一致,如下

class DS(object):

def ope(self):

pass

class USER(object):

pass

a=USER()

db=DS()

db.ope()

#模块和名

#除了特殊模块__init__之外,模块名称都使用不带下划线的小写字母命名,如下

"""

os,sys,shbutil

当模块对于包而言是私有的时候,将添加一个前导下划线,编译过c或者c++模块名称通常带有一个下划线并且将导入到纯python模块中

包遵守相同规则,因为它们在命名空间中表现和模块类似

"""

时间: 2024-11-10 01:22:36

python高级编程之选择好名称:pepe8和命名最佳实践的相关文章

python高级编程之选择好名称:完

由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' #使用API #跟踪冗长 #创建代码库时,最常见的错误是api冗长(api verbosity),当一个功能对包的调用是一组而不是一个时,出现下面错误 #script_engine包例子 #from script_engine import make_con

python高级编程之选择好名称:命名指南

# # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' #命名指南 #一组常用的命名规则可以被应用到变量,方法函数和属性上,类和模块的名称在命名空间叫是扮演重要角色的,所以一般有2个模式:觉模式和反模式 #使用has,is前缀命名布尔元素,例如 #当一个元素用来保存布尔值,使用has,is前缀命名布尔元素是一个很好的选择 class DB(object): is_connected=False has_cac

python高级编程之选择好名称:完2

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #分解代码 #小就是美,这也适用所有级别的代码,当一个函数,类或者一个代码太大时,应该对其进行分解 #一个函数或者一个方法的内容不应该起过一个屏幕,也就是大约25到30行,否则它将很难跟踪和理解 #关于代码生可以参看eric raymond所著的art of unix programming(中文版<unix编码艺术>)中章节 #类的方法数量应该有一定的限制,当方

Python高级编程pdf

下载地址:网盘下载 内容简介  · · · · · · <Python高级编程>通过大量的实例,介绍了Python语言的最佳实践和敏捷开发方法,并涉及整个软件生命周期的高级主题,诸如持续集成.版本控制系统.包的发行和分发.开发模式.文档编写等.<Python高级编程>首先介绍如何设置最优的开发环境,然后以Python敏捷开发方法为线索,阐述如何将已被验证的面向对象原则应用到设计中.这些内容为开发人员和项目管理人员提供了整个软件工程中的许多高级概念以及专家级的建议,其中有些内容的意义

python高级编程之装饰器01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #装饰器01 #特点是:使得函数和方法封装(接收一个函数并返回增强版本一个函数) #语法:原始场景可以将方法 在定义首部将其定义为类方法或者静态方法,在未使用装饰器之前,语法如下: class WhatFort(object): def it(cls): print 'work with %s:'%cls it=classmethod(it) def uncommo

python高级编程之最佳实践,描述符与属性01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的问题,必须考虑到几下几点: ~1:应该避免多重继承,可以一些设计模式来代替它 ~2:super使用必须一致,在类层次结构中,应该在所有地方都使用super或者彻底不使用它,滥用super和传统调用是一种滥用方法,建议使用super ~3:不要滥用经典类和新式类,两者都具备代码库将导致不同的mro表现 ~4:调

python高级编程之(类级):子类内建类型

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一(请访问:https://www.python.org/download/releases/2.2.3/descintro(可能已经不存在了))-这使内建类型的子类化成为可能,并且添加一个新内建类型object #用于所有内建类的公共祖先 #展示一个名为distinctdict类的代码,与平常的dic

python高级编程:有用的设计模式2

# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一个代价昂贵或者远程的资源提供了一个非直接访问的机制 在客户和主意之间,如图.它用来优化对高代价主题的访问,比如,在前一章中描述的memoize装饰器可以被认为是一个代理 ,它还可以用提供到一个主题智能访问,例如,大的视频文件可以封闭在代理中,以避免在用户仅仅请教其标题时就将文件载入到内存中 urllib2出给

python高级编程:有用的设计模式1

# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言相关解决识方案,最近最流行的书籍:"""gamma.heim.johson和vlissides a.k.a"四人组(gof)"编写的elements of reusable object-oriented software(中文:<设计模式:可复用面向对