码迷,mamicode.com
首页 > 编程语言 > 详细

python 命名

时间:2015-05-19 20:34:38      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

命名风格


一、变量命名

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.

 

python 命名

标签:

原文地址:http://www.cnblogs.com/mydevops/p/4515285.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!