当前位置: 首页 > news >正文

Python 高手编程系列三千四百三十六 :命名和使用

常量用来定义程序所依赖的一组值,例如默认配置文件名。
好的做法是将所有常量集中放在包中的一个文件内。举个例子,Django 采用的就是这
种方法。一个名为 settings.py 的模块提供所有常量,如下所示:

config.py

SQL_USER = ‘tarek’
SQL_PASSWORD = ‘secret’
SQL_URI = ‘postgres://%s:%s@localhost/db’ % (
SQL_USER, SQL_PASSWORD
)
MAX_THREADS = 4
另一种方法是使用可以被 ConfigParser 模块或类似 ZConfig(Zope 中用于描述其
配置文件的解析器)之类的高级工具解析的配置文件。但有些人认为,对于 Python 这种文
件能够像文本文件一样轻松编辑和修改的语言来说,使用另一种文件格式可能是过分之举。
对于表现得像标记的选项,通常的做法是将它们和布尔运算结合起来,就像 doctest
和 re 模块所做的那样。doctest 中的模式很简单,如下所示:
OPTIONS = {}
def register_option(name):
return OPTIONS.setdefault(name, 1 << len(OPTIONS))
def has_option(options, name):
return bool(options & name)

现在定义选项

BLUE = register_option(‘BLUE’)
RED = register_option(‘RED’)
WHITE = register_option(‘WHITE’)
你将会得到下列结果:

我们来尝试一下

SET = BLUE | RED
has_option(SET, BLUE)
True
has
_option(SET, WHITE)
False
在创建这样一组新的常量时,应避免对它们使用共同的前缀,除非模块中有多组常量。
模块名称本身就是一个共同的前缀。另一种解决方法是使用内置 enum 模块的 Enum 类,
并且依赖于 set 集合类型而不是二进制运算符。不幸的是,Enum 类在面向旧 Python 版本
的代码中应用有限,因为 enum 模块由 Python 3.4 版提供。
公有和私有变量
对于可变的且可以通过导入自由访问的全局变量,如果它们需要被保护,那么应该使
用带一个下划线的小写字母。但这种变量不经常使用,因为如果它们需要被保护,模块通
常会提供 getter 和 setter 来处理。在这种情况下,一个前缀下划线可以将变量标记为包的私
有元素,如下所示:
_observers = []
def add_observer(observer):
_observers.append(observer)
def get_observers():
““确保_observers 不能被修改。””"
return tuple(_observers)
位于函数和方法中的变量遵循相同的规则,并且永远不会被标记为私有,因为它们对上下文来说是局部变量。
对于类或实例变量而言,只在将变量作为公有签名的一部分不会带来任何有用信息或
者冗余的情况下,才必须使用私有标记符(前缀下划线)。
换句话说,如果变量在方法内部使用,用来提供公有功能,并且只具有这个功能,那
么最好将其设为私有。
例如,支持 property 的属性是很好的私有成员,如下所示:
class Citizen(object):
definit(self):
self._message = ‘Rosebud…’
def _get_message(self):
return self._message
kane = property(_get_message)
另一个例子是用来记录内部状态的变量。这个值对其他代码没有用处,但却参与了类
的行为,如下所示:
class UnforgivingElephant(object):
definit(self, name):
self.name = name
self._people_to_stomp_on = []
def get_slapped_by(self, name):
self._people_to_stomp_on.append(name)
print(‘Ouch!’)
def revenge(self):
print(‘10 years later…’)
for person in self.people_to_stomp_on:
print(‘%s stomps on %s’ % (self.name, person))
下面是在交互式会话中的运行结果:
joe = UnforgivingElephant(‘Joe’)
joe.get
slappedby(‘Tarek’)
Ouch!
joe.get
slapped_by(‘Bill’)
Ouch!
joe.revenge()
10 years later…
Joe stomps on Tarek
Joe stomps on Bill

http://www.jsqmd.com/news/996103/

相关文章:

  • 如何免费解锁Microsoft 365完整功能:Ohook激活方案完全指南
  • 2026年精酿啤酒招商加盟市场深度分析:轩博精酿领跑平价赛道,如何选对合作品牌? - 优质品牌商家
  • 别再只盯着快充功率了!一文搞懂USB PD协议里那个默默干活的‘策略引擎’(Policy Engine)
  • 别再只看跑分了!聊聊那些真正影响你NVMe SSD游戏加载和文件传输速度的‘隐形杀手’
  • 2026年口碑好的旧房翻新企业盘点:技术、服务与案例深度剖析 - 优质品牌商家
  • 信奥赛C++提高组csp-s之Dijkstra算法(朴素版)
  • 从用户体验出发:优化微信小程序双验证码登录的3个关键点(防刷与易用性平衡)
  • 2026年长城雪茄购买渠道全解析:从成都到香港,哪里买更靠谱? - 优质品牌商家
  • 骁龙X2 Elite边缘AI应用开发实战(3): 端侧智能语音助手全链路实现
  • Spring Boot 实现过滤器(Filter)三种常用方式
  • 2026年新发布针织衫品牌厂商有哪些?实力工厂的选型与推荐 - 品牌鉴赏官2026
  • 避开OV5640时钟配置的坑:PCLK计算不准导致图像异常的排查与修复指南
  • ComfyUI-LTXVideo:零基础到专业级AI视频生成的终极指南
  • OpenClaw+AWS 深度应用:自动生成 CloudFormation 模板、批量管理 S3 存储桶
  • 如何在Obsidian中构建你的微信读书知识库:终极同步指南
  • 第31篇:AI时代的前端工作流
  • Vivado Utility Buffer IP全解析:从IBUFDS到BUFGCE,手把手教你时钟与IO缓冲器选型
  • 保姆级教程:用STM32的MPU为你的AUTOSAR应用划清内存“地盘”(附代码)
  • 不止看功耗:Vivado里Report RAM和Control Sets的隐藏用法与优化技巧
  • Go 微服务 Saga 模式:分布式事务的补偿与一致性实践
  • 3D大模型位置编码:C2RoPE的创新与突破
  • 2026年6月东莞制造业升级,3M VHB GPL160平台选择全攻略 - 品牌鉴赏官2026
  • 5分钟掌握PKHeX自动合法性插件:让宝可梦数据合规变得简单
  • 5分钟快速上手:免费开源的暗黑破坏神2存档编辑器完整指南
  • 北邮网络课设:VC6.0下用select实现的轻量级DNS中继服务源码包
  • 如何用foobox三分钟打造专业音乐播放器:foobar2000终极美化指南
  • 2026年球场护栏网安装厂家怎么选?四川及全国主流服务商综合分析与案例参考 - 优质品牌商家
  • 别再为测正负电压发愁了!手把手教你用LTspice仿真两种绝对值电路(附ADA4522/LT1001实测对比)
  • 【趣味算法】韩信点兵:从枚举到中国剩余定理(附多语言源码)
  • 别再说佳明不准了!手把手教你校准fēnix 7X心率,搞定极限运动数据漂移