当前位置: 首页 > 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):
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.rkmt.cn/news/1526332.html

相关文章:

  • ISODATA vs K-Means:在ENVI CLASSIC里实战对比,到底该选哪个算法?
  • 2026免费音频转FLAC在线保姆级教程!无限制工具手把手教学,免费获得无损音乐格式 - 时时资讯
  • 从内存困境到流畅体验:PCL2启动器的智能资源管理革命
  • 心电图特征点检测系统Matlab程序含GUI2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 牛客网Java面试题汇总(2026秋招最新版,附答案,持续更新)
  • 终极AI换脸指南:3步实现专业级深度伪造,无需训练!
  • 2026这6款宝藏降AI率网站全网首测,一键让AIGC率断崖式下跌!
  • 2026免费音频转CAF在线保姆级教程!无限制工具手把手教学,iOS系统原生核心音频格式 - 时时资讯
  • 照着用就行:一键生成论文工具2026最新测评与推荐
  • 影刀RPA新手教程_多账号Cookie池调度高并发采集的账号资源管理
  • 2026免费音频转WMA在线保姆级教程!无限制工具手把手教学,老式Windows Media Player通用 - 时时资讯
  • 117、【Agent】【OpenCode】项目配置(根目录子包配置)
  • BedrockLauncher:颠覆性Minecraft基岩版智能版本管理解决方案
  • 想高效完成一篇高质量的文献综述,AI辅助工具该怎么选?求真实推荐
  • Java毕设选题推荐:基于 SpringBoot 的水果商品展示与交易管理系统的设计与实现 生鲜水果线上零售管理平台【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2026免费视频转WMV在线保姆级教程!无限制工具手把手教学,Windows老系统兼容神器 - 时时资讯
  • 2026年怀化手表回收到底该怎么选?给你推荐五家靠谱的(2026年6月14日最新版) - 空空是也
  • 3DGRUT实战指南:高效高斯粒子光线追踪与栅格化技术深度解析
  • 2026免费视频转WEBM在线保姆级教程!无限制工具手把手教学,HTML5现代网页最佳格式 - 时时资讯
  • HackMyVM-Canto
  • Deep-Live-Cam:3步实现实时AI换脸,开启移动端深度伪造新纪元
  • 从直播小白到多平台达人:obs-multi-rtmp带你玩转同步直播
  • shutil模块
  • py每日spider案例之某多多查询商品接口anti_content参数逆向源码(webpack+补环境)
  • 2026广州电缆回收怎么估价铜价换算公式与避坑要点 - 广东再生资源回收
  • FanControl终极指南:三步实现Windows电脑风扇智能控制
  • AI推荐发布平台怎么用更好_我在CSDN_AI数字营销上的使用心得
  • 普宁月子中心大房间家属陪护|套房设计比单间好在哪里 - 品牌观察
  • Java毕设选题推荐:基于 B/S 架构的足球俱乐部后台管理系统的设计与实现 依托 SpringBoot 技术的足球赛事与队员管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • MPC8260 SCC HDLC与BISYNC协议硬件配置与调试实战详解