Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
扩展 Python 内置类型:子类化 int 和 list 的正确姿势_创想鸟

扩展 Python 内置类型:子类化 int 和 list 的正确姿势

扩展 python 内置类型:子类化 int 和 list 的正确姿势

摘要:在 Python 中直接子类化并重写内置类型(如 int 和 list)的行为是不被鼓励的,并且可能导致代码不稳定。本文解释了原因,并提供了一种使用包装类来实现类似功能的更安全、更符合 Python 惯例的方法。

尝试扩展 Python 的内置类型(如 int 和 list)可能会遇到一些意想不到的困难。例如,你可能希望为 int 或 list 添加自定义方法,如 toString()。然而,直接子类化这些内置类型并添加方法,然后期望所有 int 或 list 对象都具备这些方法,通常不会如你所愿。

class int(int):     def __new__(cls, value): return super().__new__(cls, value)     def toString(self) -> str: return str(self)c = int(8)d = 8print(c.toString())# print(d.toString())     # Error: 'int' object has no attribute 'toString'class list(list):     def __init__(self, li): super(list, self).__init__(li)     def toString(self) -> str: return ' '.join(str(x) for x in self)a = list([1,2,3])b = [1,2,3]print(a.toString())# print(b.toString())   # Error: 'list' object has no attribute 'toString'

上述代码展示了尝试扩展 int 和 list 类型,并添加 toString() 方法的例子。然而,只有通过 int() 或 list() 构造函数创建的对象才能访问到 toString() 方法。直接赋值创建的对象(如 d = 8 或 b = [1, 2, 3])仍然是原始的 int 或 list 类型,因此不具备 toString() 方法。

为什么不应该重写内置类型?

立即学习“Python免费学习笔记(深入)”;

Python 的设计者有意不允许直接重写内置类型。这是为了保证代码的稳定性。如果 [1, 2, 3] 突然因为某些模块的导入而表现出不同的行为,这会破坏代码的可预测性。想象一下,如果所有 int 对象都具有了自定义的行为,这可能会导致各种意想不到的问题。

正确的姿势:使用包装类

在 Python 中,实现类似功能的更安全、更符合惯例的方法是使用包装类。创建一个新的类,该类包含一个 int 或 list 对象作为其属性,并提供自定义的方法来操作该对象。

class StringableInt:    def __init__(self, value: int):        self.value = value    def to_string(self) -> str:        return str(self.value)class StringableList:    def __init__(self, li: list):        self.data = li    def to_string(self) -> str:        return ' '.join(str(x) for x in self.data)c = StringableInt(8)d = StringableList([1, 2, 3])print(c.to_string())  # 输出: 8print(d.to_string())  # 输出: 1 2 3

在这个例子中,StringableInt 和 StringableList 是包装类,它们分别包含一个 int 和 list 对象。to_string() 方法是这些类提供的自定义方法,用于将内部对象转换为字符串。

注意事项:

命名: 避免使用与内置类型相同的名称(例如 int 或 list)来命名你的包装类。这可以避免混淆。方法名: 遵循 Python 的命名惯例,使用下划线分隔单词(例如 to_string 而不是 toString)。类型注册: 如果你的包装类需要与某些类型检查或接口兼容,可以考虑使用 numbers.Integral.register(StringableInt) 进行注册。

总结:

虽然在 Python 中直接扩展内置类型可能很诱人,但使用包装类通常是更安全、更灵活的选择。这种方法避免了潜在的冲突和不稳定性,并允许你以一种更可控的方式添加自定义功能。 虽然有一些第三方库(如 extype)允许你扩展内置类型,但通常不建议这样做,除非你非常清楚自己在做什么,并充分了解潜在的风险。

以上就是扩展 Python 内置类型:子类化 int 和 list 的正确姿势的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1365894.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
自定义Tkinter标签类:理解super()和标签绑定
上一篇 2025年12月14日 04:52:07
解决Keras中无法导入Conv1D的问题
下一篇 2025年12月14日 04:52:15

相关推荐

  • 如何配置磁盘配额限制用户存储空间?

    如何配置磁盘配额限制用户存储空间?如何配置磁盘配额限制用户存储空间?如何配置磁盘配额限制用户存储空间?如何配置磁盘配额限制用户存储空间?

    配置磁盘配额可防止资源滥用、保障系统稳定,核心步骤包括:启用文件系统配额功能,编辑/etc/fstab添加usrquota和grpquota选项,重新挂载文件系统,生成配额文件aquota.user和aquota.group,使用edquota设置用户或组的磁盘空间与文件数软硬限制,并通过quota…

    2026年9月25日 • 用户投稿
    000
  • 高分辨率传感器在摄像头中的实际效果取决于哪些因素?

    高分辨率传感器在摄像头中的实际效果取决于哪些因素?高分辨率传感器在摄像头中的实际效果取决于哪些因素?高分辨率传感器在摄像头中的实际效果取决于哪些因素?高分辨率传感器在摄像头中的实际效果取决于哪些因素?

    高分辨率传感器需配合优质镜头、先进算法和充足光线才能发挥优势,提升细节表现,但受限于传感器尺寸、动态范围及存储处理需求,并非在所有场景下都必要。 因赛AIGC 因赛AIGC解决营销全链路应用场景 73 查看详情 高分辨率传感器在摄像头中带来的效果并非单纯的像素数量增加,而是与镜头素质、图像处理算法、…

    2026年9月25日 • 用户投稿
    100
  • 为什么你的电脑总是有莫名其妙的噪音?

    噪音多因硬件异常或老化,先判别类型及时处理;风扇积尘、轴承损坏致嗡嗡或吱吱声,清灰或更换可解决;机械硬盘咔哒响或是损坏前兆,须立即备份数据;电源或主板劣质元件引发滋滋声,需检查质量;机箱松动或共振产生震动噪音,紧固螺丝可改善。 电脑出现莫名其妙的噪音,通常不是无缘无故的。这些声音往往来自硬件运行中的…

    2026年9月25日
    300
  • 抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退

    抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退

    在当今这个短视频盛行的时代,抖音无疑成为了许多人展示才华、分享生活的舞台。而抖音旗下的巨量千川广告平台,更是让许多商家和创作者通过广告实现了商业变现。在使用巨量千川的过程中,如何提取账户余额成为了一个让人头疼的问题。今天,就让我来为大家详细解析一下抖音巨量千川账户余额提现的全过程,让你轻松提取,安全…

    2026年9月25日 • 用户投稿
    100
  • 主板 M.2 接口的散热设计是否必要?

    主板 M.2 接口的散热设计是否必要?主板 M.2 接口的散热设计是否必要?主板 M.2 接口的散热设计是否必要?主板 M.2 接口的散热设计是否必要?

    对于高性能NVMe SSD,M.2接口散热设计十分必要。其能有效防止高负载下的热节流现象,保障持续性能输出并延长硬盘寿命。尤其在使用PCIe Gen4及以上规格SSD进行大文件传输、游戏或专业工作时,主板自带或额外加装的散热片可显著降低温度。中低端主板附带的简易散热片效果有限,仅适合轻度使用;而中高…

    2026年9月25日 • 用户投稿
    100
  • mysql如何读取数据库数据

    mysql如何读取数据库数据mysql如何读取数据库数据mysql如何读取数据库数据mysql如何读取数据库数据

    MySQL 读取数据库数据有两种常用方法:SELECT 语句,用于从表中提取数据,语法为:SELECT [列名] FROM [表名] [条件] [分组] [条件] [排序] [限制]。fetchall() 方法,用于将所有结果行存储在一个元组列表中。 MySQL 读取数据库数据 MySQL 提供了多…

    2026年9月25日 • 用户投稿
    100
  • Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​

    Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​

    用 deepseek 满血版 + copy.ai 的模板能高效产出高质量文案;deepseek 擅长理解和生成内容,copy.ai 提供成熟模板,两者结合保障结构与创意;操作时先选 aida、pas、bab 等高频率模板,再将产品信息与模板一同输入 deepseek 生成初稿;使用时需调整模板灵活性…

    2026年9月25日 • 用户投稿
    100
  • 电脑要按f11才能进入系统怎么回事?电脑为什么按f11才进入系统

    电脑要按f11才能进入系统怎么回事?电脑为什么按f11才进入系统电脑要按f11才能进入系统怎么回事?电脑为什么按f11才进入系统电脑要按f11才能进入系统怎么回事?电脑为什么按f11才进入系统电脑要按f11才能进入系统怎么回事?电脑为什么按f11才进入系统

    最近有朋友向小编反映了一个关于电脑使用的问题:他的电脑在开机时无法直接进入系统,必须按下f11键后才能正常启动,对此感到十分困惑。接下来,小编就为大家解析一下为什么电脑需要按f11才能进入系统。 为何电脑需按F11才能进入系统? 这通常是由于BIOS中的启动设置出现偏差所致。例如,电脑本身并未配备软…

    2026年9月25日 • 用户投稿
    300
  • sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法

    sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法

    点击状态栏语言名可快速切换语法类型,立即应用高亮规则;2. 用Ctrl+Shift+P或Cmd+Shift+P打开命令面板,输入Set Syntax选择目标语言;3. 通过“Open all with current extension as…”设置默认语法关联,或手动编辑配置文件,使特…

    2026年9月25日 • 用户投稿
    300
  • 小红书怎么查注册日期?小红书怎么查注册日期和时间

    小红书怎么查注册日期?小红书怎么查注册日期和时间小红书怎么查注册日期?小红书怎么查注册日期和时间小红书怎么查注册日期?小红书怎么查注册日期和时间小红书怎么查注册日期?小红书怎么查注册日期和时间

    随着社交媒体的不断发展,小红书已经成为了一个热门的分享平台。在这个平台上,我们可以发现各种有趣的内容,结交志同道合的朋友,甚至还能找到生活中的灵感。你是否好奇过自己是在什么时间注册的小红书呢?今天,就让我来带你了解一下,如何在小红书上查找注册日期。 一、登录小红书账号 当然是要确保你已经成功注册了小…

    2026年9月25日 • 用户投稿
    100
  • 为什么苹果手机副卡收不到短信

    为什么苹果手机副卡收不到短信为什么苹果手机副卡收不到短信为什么苹果手机副卡收不到短信为什么苹果手机副卡收不到短信

    苹果手机副卡无法收到短信的原因如下:副卡未激活iMessage 未启用蜂窝数据未打开短信中心设置不正确SIM 卡损坏网络拥塞运营商限制 为什么苹果手机副卡收不到短信? 苹果手机持有者在使用副卡时,可能会遇到收不到短信的问题。以下是一些常见原因: 1. 副卡未激活 检查您的副卡是否已激活。未激活的副卡…

    2026年9月25日 • 用户投稿
    100
  • sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧

    sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧

    使用Ctrl+R或Cmd+R打开“前往符号”面板,可快速定位函数和类;通过安装SideBarEnhancements等插件,在侧边栏查看文件符号树;配合LSP插件支持,使用F12实现“转到定义”跨文件跳转;自定义快捷键如Ctrl+Shift+R优化操作效率。 在使用 Sublime Text 编辑代…

    2026年9月25日 • 用户投稿
    400
  • 为什么有些硬件评测中的噪音数据与实际感受不符?

    为什么有些硬件评测中的噪音数据与实际感受不符?为什么有些硬件评测中的噪音数据与实际感受不符?为什么有些硬件评测中的噪音数据与实际感受不符?为什么有些硬件评测中的噪音数据与实际感受不符?

    噪音数据与实际感受不符因分贝值忽略频率分布、噪音类型、环境背景及主观差异,评测环境与真实场景不同,需综合考量测试方法与个体感知差异。 硬件评测中的噪音数据与实际感受不符,这很常见。原因在于,数据只是一个冰冷的数字,它无法完全捕捉人耳对噪音的感知复杂性,以及环境因素的影响。 数据是数据,感受是感受,两…

    2026年9月25日 • 用户投稿
    200
  • mysql怎么创建新连接

    mysql怎么创建新连接mysql怎么创建新连接mysql怎么创建新连接mysql怎么创建新连接

    要创建新的 MySQL 连接,需要导入 MySQL Connector,然后依次创建连接对象、验证连接、创建游标对象、执行查询、检索结果,最后关闭连接。 如何创建新的 MySQL 连接 若要创建新的 MySQL 连接,可以使用以下步骤: 1. 导入 MySQL Connector 导入 MySQL …

    2026年9月25日 • 用户投稿
    100
  • 为什么苹果手机锁屏了还会亮

    为什么苹果手机锁屏了还会亮为什么苹果手机锁屏了还会亮为什么苹果手机锁屏了还会亮为什么苹果手机锁屏了还会亮

    苹果手机锁屏后仍会亮起的原因包括:息屏显示、抬腕唤醒、轻点唤醒、附近设备解锁和背景应用刷新。为了防止这种情况,用户可以禁用以下功能:息屏显示、抬腕唤醒、轻点唤醒、附近设备解锁和背景应用刷新。 苹果手机锁屏后为什么仍然会亮? 苹果手机锁屏后仍然会亮通常是因为以下原因之一: 1. 息屏显示功能 息屏显示…

    2026年9月25日 • 用户投稿
    200
  • 为什么苹果手机拍出来的照片发黄

    为什么苹果手机拍出来的照片发黄为什么苹果手机拍出来的照片发黄为什么苹果手机拍出来的照片发黄为什么苹果手机拍出来的照片发黄

    苹果手机照片发黄的原因有硬件因素(镜头镀膜氧化、色温传感器偏差)、软件因素(图像增强算法、色温设置)、环境因素(灯光环境、曝光不足)等。可通过校准色温、使用自然光、手动调整设置、使用第三方相机应用、后期处理等办法解决。 苹果手机照片发黄的原因 一、硬件因素 镜头镀膜氧化:随着时间的推移,镜头镀膜会氧…

    2026年9月24日 • 用户投稿
    100
  • 为什么有些SSD参数漂亮但实际体验却令人失望?

    为什么有些SSD参数漂亮但实际体验却令人失望?为什么有些SSD参数漂亮但实际体验却令人失望?为什么有些SSD参数漂亮但实际体验却令人失望?为什么有些SSD参数漂亮但实际体验却令人失望?

    SSD实际体验不佳的核心在于纸面参数仅反映理想条件下的峰值性能,而真实使用中受主控、闪存类型、SLC缓存耗尽、DRAM缓存缺失、固件优化不足及散热不良等因素影响,导致持续写入速度骤降、系统卡顿等问题。 很多时候,我们看着SSD产品页面上那些漂亮的顺序读写速度,比如几千MB/s,或者惊人的IOPS,心…

    2026年9月24日 • 用户投稿
    100
  • VSCode 怎样通过快捷键快速折叠所有代码块 VSCode 快速折叠所有代码块的快捷键方法​

    在vscode中一键折叠所有代码的快捷键是ctrl + k后按ctrl + 0(mac为cmd + k再按cmd + 0),该操作可将函数、类、条件语句等所有可折叠区域全部收起,帮助快速概览文件结构、提升阅读与定位效率;此外,还可使用ctrl + shift + [折叠当前代码块、ctrl + k,…

    2026年9月24日
    100
  • mysql怎么使用数据库命令

    mysql怎么使用数据库命令mysql怎么使用数据库命令mysql怎么使用数据库命令mysql怎么使用数据库命令

    MySQL 命令包括:1. 数据操作语言(DML):SELECT、INSERT、UPDATE、DELETE;2. 数据定义语言(DDL):CREATE、ALTER、DROP;3. 数据控制语言(DCL):GRANT、REVOKE;4. 事务控制:BEGIN、COMMIT、ROLLBACK;5. 实用…

    2026年9月24日 • 用户投稿
    100
  • sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置

    sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置

    在Sublime Text中设置代码片段触发词需编辑tabTrigger标签,2. 创建新片段并配置content、tabTrigger、scope等字段,3. 将文件保存为Packages/User/下的.sublime-snippet格式,4. 在对应语言文件中输入触发词后按Tab键即可展开。 …

    2026年9月24日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信