在Python开发中,我们经常需要定义具有层次结构的字符串常量,例如HTTP API的端点路径、配置项路径或文件系统路径。理想情况下,我们希望能够通过直观的点分表示法(如`Endpoints.CONFIGURATION.ACTIVE`)来访问这些常量,并且当访问任何一个层级时,都能自动构建出完整的路径字符串(如`/configuration/active`)。传统的方法,如简单的嵌套类或字典,往往难以同时满足点分访问、自动路径构建以及IDE自动补全的需求。
为了解决上述挑战,我们可以设计一个自定义的Endpoint类。这个类将通过内部维护父子关系,并巧妙地利用Python的魔术方法,实现所需的功能。
Endpoint类通过以下关键属性和方法来管理层次结构和字符串构建:
from collections.abc import Iterable
class Endpoint:
def __init__(self, name: str) -> None:
self._name = name
self._children = {}
self._parent = None__dir__(self) -> Iterable[str]: 这个方法允许我们自定义dir()函数或IDE自动补全时返回的属性列表。通过将子端点的名称添加到默认属性列表中,我们使得点分访问时可以提示子端点。
def __dir__(self) -> Iterable[str]:
cls_attrs = object.__dir__(self)
return [n for n in self._children] + cls_attrs__repr__(self) -> str: 提供一个清晰的、对开发者友好的对象表示,通常用于调试。
def __repr__(self) -> str:
return f'' __str__(self) -> str: 这是实现路径自动构建的核心。当Endpoint实例被转换为字符串时,它会递归地调用其父端点的__str__方法,并将其结果与当前端点的名称拼接起来,从而构建出完整的层次化路径。如果存在父节点,路径会以/分隔。
def __str__(self) -> str:
if self._parent:
up = f'{str(self._parent)}/'
else:
up = ''
return f'{up}{self._name.lower()}'注意:这里将_name转换为小写,以符合常见的URL路径规范。
__getattr__(self, _attr: str): 当尝试访问一个不存在的属性时,Python会调用此方法。我们利用它来检查请求的属性名是否存在于_children字典中。如果存在,则返回对应的子Endpoint实例,从而实现点分访问。
def __getattr__(self, _attr: str):
if _attr in self._children:
return self._children[_attr]
return object.__getattribute__(self, _attr)为了方便地构建层次结构,我们提供了append_endpoint方法和__iadd__(in-place add)魔术方法。
append_endpoint(self, endpoint_name: str): 这是一个内部方法,用于创建并添加一个新的子Endpoint实例。它会检查子端点名称是否重复,并设置新子端点的_parent引用为当前实例。
def append_endpoint(self, endpoint_name: str):
if any(c.lower()==endpoint_name.lower() for c in self._children): # 增加大小写不敏感的检查
raise KeyError(f'A sub-endpoint {endpoint_name!r} already exists.')
new_endpoint = self.__class__(endpoint_name)
new_endpoint._parent = self
self._children[endpoint_name] = new_endpoint__iadd__(self, endpoint_name: str): 这个方法使得我们可以使用+=运算符来添加子端点,语法更加简洁直观。
def __iadd__(self, endpoint_name: str):
if not isinstance(endpoint_name, str):
return NotImplemented
self.append_endpoin
t(endpoint_name)
return self现在,我们来看看如何使用这个Endpoint类来构建和访问层次化常量:
# 创建根端点
config = Endpoint('CONFIGURATION')
# 使用 += 运算符添加子端点
config += 'ACTIVE' # 'ACTIVE' 将出现在点分补全中
config.ACTIVE += 'LAST' # 进一步嵌套
config += 'INACTIVE'
config.INACTIVE += 'HISTORY'
config.INACTIVE.HISTORY += 'Y2025'
config.INACTIVE.HISTORY += 'Y2025'
config.INACTIVE.HISTORY += 'Y2025'
config.INACTIVE.HISTORY += 'Y2025'
# 访问并获取完整的路径字符串
print(str(config))
# 输出: 'configuration'
print(str(config.ACTIVE))
# 输出: 'configuration/active'
print(str(config.ACTIVE.LAST))
# 输出: 'configuration/active/last'
print(str(config.INACTIVE.HISTORY.Y2025))
# 输出: 'configuration/inactive/history/y2025'通过构建自定义的Endpoint类,我们成功地实现了一种优雅且强大的方式来管理Python中的层次化字符串常量。这种方法不仅支持直观的点分表示法访问和IDE自动补全,还能够根据层级自动构建出完整的路径字符串。它提供了一种高度可读和可维护的解决方案,特别适用于定义API端点、配置路径或任何需要结构化字符串常量的场景,显著提升了开发效率和代码质量。
# python
# 前端
# app
# ai
# 字符串常量
相关文章:
建站主机是否等同于虚拟主机?
,南京靠谱的征婚网站?
PHP 500报错的快速解决方法
网站制作企业,网站的banner和导航栏是指什么?
如何高效配置香港服务器实现快速建站?
python的本地网站制作,如何创建本地站点?
*服务器网站为何频现安全漏洞?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何通过虚拟主机空间快速建站?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
实现虚拟支付需哪些建站技术支撑?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
无锡营销型网站制作公司,无锡网选车牌流程?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
成都网站制作报价公司,成都工业用气开户费用?
如何用好域名打造高点击率的自主建站?
自助网站制作软件,个人如何自助建网站?
动图在线制作网站有哪些,滑动动图图集怎么做?
如何注册花生壳免费域名并搭建个人网站?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
建站主机选择指南:服务器配置与SEO优化实战技巧
如何在Golang中使用replace替换模块_指定本地或远程路径
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何配置FTP站点权限与安全设置?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
学校为何禁止电信移动建设网站?
定制建站如何定义?其核心优势是什么?
C++中引用和指针有什么区别?(代码说明)
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
兔展官网 在线制作,怎样制作微信请帖?
建站主机SSH密钥生成步骤及常见问题解答?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
行程制作网站有哪些,第三方机票电子行程单怎么开?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
建站之星后台管理如何实现高效配置?
建站之星ASP如何实现CMS高效搭建与安全管理?
建站之星安装路径如何正确选择及配置?
常州自助建站费用包含哪些项目?
文字头像制作网站推荐软件,醒图能自动配文字吗?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何在阿里云部署织梦网站?
C#如何在一个XML文件中查找并替换文本内容
建站之星代理平台如何选择最佳方案?
南宁网站建设制作定制,南宁网站建设可以定制吗?
c++怎么用jemalloc c++替换默认内存分配器【性能】
*请认真填写需求信息,我们会在24小时内与您取得联系。