set 和 freezeset 的继承行为似乎不同

2024-04-09

有人可以解释以下行为:

class derivedset1(frozenset):
    def __new__(cls,*args):
        return frozenset.__new__(cls,args)  

class derivedset2(set):
    def __new__(cls,*args):
        return set.__new__(cls,args)    

a=derivedset1('item1','item2') # WORKS 
b=derivedset2('item1','item2') # DOESN'T WORK

Traceback (most recent call last):
  File "inheriting-behaviours.py", line 12, in <module>
    b=derivedset2('item1','item2') # DOESN'T WORK
TypeError: derivedset2 expected at most 1 arguments, got 2

让我感到惊讶的是,您可以更改冻结集的构造函数,而可变集的构造函数则不可能。


来自Python 文档 http://docs.python.org/reference/datamodel.html#object.__new__:

If __new__()返回一个实例cls,那么新实例的__init__() 方法将被调用__init__(self[, ...]), where self是新实例,其余参数与传递给的参数相同__new__().

set.__init__仅接受一个参数,一个指定初始设置内容的可迭代对象。因此,您应该添加自己的初始化程序,它接受所有附加参数并将它们作为初始设置值提供:

class derivedset2(set):
    def __new__(cls,*args):
        return set.__new__(cls,*args)

    def __init__(self, *initial_values):
        set.__init__(self, initial_values)

请注意,您应该覆盖__init__并避免实施__new__除非你想实现对象缓存、单例或类似的奇怪的东西。您的子类化适用于frozenset正是因为frozenset does从对象缓存中获益,即 Python 解释器只需要一个frozenset两个实例frozenset具有相同内容的对象。

一般来说,您应该避免对内置类进行子类化,特别是如果您的语义不兼容(在这种情况下,set([]) and derivedset2([])返回完全不同的结果)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

set 和 freezeset 的继承行为似乎不同 的相关文章

随机推荐

  • Guava 地图中的驱逐惰性

    当前的地图驱逐算法相当懒惰 看起来过期的对象只有在访问数据结构时才会被驱逐 例如 从地址到索引器的映射定义为 ConcurrentMap
  • 将控件定位在复选框的中间

    这是我之前问题的后续 依赖于字体的控制定位 https stackoverflow com questions 37306 font dependent control positioning 这是试图解决这个问题real这个问题背后的问题
  • BigTable中的布隆过滤器可以仅根据行ID进行过滤吗?

    BigTable 使用布隆过滤器来允许点读取 以避免访问给定键列对内不包含任何数据的 SSTable 如果查询只指定行 ID 而没有列 ID 这些布隆过滤器是否也可用于避免访问 SSTable BigTable 使用行列对作为插入其布隆过滤
  • 检测ES模块是否在Node中从命令行运行

    在 Node 中使用 CommonJS 模块时 您可以使用以下命令检测脚本是否正在从命令行运行require main module 在 Node 中使用 ES 模块时 检测脚本是否正在从命令行运行的等效方法是什么 使用 experimen
  • 套接字编程Python:如何确保收到完整消息?

    我正在使用 python 3 x 和套接字模块 服务器在 ipv4 地址上运行并使用 tcp 我阅读了一些有关如何发送和接收数据的教程 对于服务器或客户端 要确保发送整个消息 您可以简单地检查发送的数据量是否等于消息的大小 def myse
  • 将 Foreach 分成线程示例

    我想跑 SearchResultByOrderNumber string orderNumber 中的方法Foreach与多线程 有十个订单号OrderNumbers数据表 在搜索这些 OrderNumbers 时OrderResultsD
  • 为什么 babel 将“true”转换为“!0”

    我检查了我转换后的代码 我看到了true被转换为 0 Example let obj loading true 转换为 let obj loading 0 这是为什么 是因为性能原因还是其他原因 对于小型化 即 更小的包大小 也可以看看 b
  • Python 委托模式 - 如何避免循环引用?

    我想问在Python中使用委托模式是否会导致循环引用 如果是的话 实现它以确保对象及其委托将被垃圾收集的最佳方法是什么 在 Objective C 中 通过使用委托的弱引用来避免上述问题 在 C 中 我们不会对委托调用删除 我在这里找到了
  • AWS 在 Google 云 (GCP) 中承担同等角色吗?

    如何在GCP中设置多帐户 项目 在AWS中可以通过使用assume role 有人知道如何在 Google Cloud Platform GCP 中执行此操作吗 我尝试在 GCP 中探索 AWS 等效项 但找不到任何文档 据记载 承担角色
  • WPF DropShadowEffect - 意外的色差

    我有一个带有 DropShadowEffect 的 TextBlock 某些阴影颜色显示得比指定的颜色更深 几乎就像它们被染色一样 然而 并非每种颜色都会发生这种情况 有谁知道为什么 或者有纠正的方法吗 这是一个非常基本的示例
  • 从网络浏览器中检测和访问 USB 设备 - 即使用插件

    是否可以通过插件 activeX Java 或 Flex 编写一个能够检测从 USB 设备通道读取数据流的浏览器插件 我做了一些研究 但没有找到答案 http support microsoft com kb 832678 http sup
  • 如何向 Visual Studio 2017 或 Visual Studio 2019 注册“自定义工具”以使其正常工作?

    背景 我们有一个定制工具 https msdn microsoft com en us library bb166817 aspx它接受 xml 输入并生成 cs 输出 自定义工具需要注册 https learn microsoft com
  • 从 mysql 迁移后 postgres 数据库不工作

    我在sequelize中将MySQL数据库更改为postgreSQL 但是迁移后我对表或模型中的大小写首字母有问题 在我的 MySQL 版本正常工作之前 但在迁移之后我收到错误消息 500 SequelizeDatabaseError re
  • Django HTML 截断

    我正在使用内置截断words html https docs djangoproject com en dev ref templates builtins from olddocs truncatewords htmlDjango 的过滤
  • 连接二维数组

    我有两个数组 mat1 和 Mat2 我想要 new mat ma1 mat2 我写了一个可以运行的函数 我想知道是否有一个适用于非常大的矩阵的有效函数或者如何使用 Array CopyTo 方法来做到这一点 public static d
  • 太多带有 unicode 文本的 UILabels

    我有180UILabels 子视图UITableViewCells 在 iPad 应用程序中 每个宽度为 155 X 155UILabel 并且每个都包含大量的 Unicode 文本 阿拉伯语 当我向下滚动时TableView它挂起 1 秒
  • SQL 查询查找车站之间的火车

    这是我的火车时刻表 我想要一个车站之间火车的解决方案 Train Code 15609 ABC 15609 XYZ 15609 PQR 15609 ADI 15609 QWE 15609 XPM 15609 IND 15680 ABC 15
  • 如何在haml模板中的coffescript中的ruby代码中使用本地或实例变量

    我是 Rails 的新手 并面临着复杂的问题 试图在 Haml 模板的 CoffeeScript 中的 ruby 辅助方法中使用变量 这是我在 haml 中的代码 coffee input field blur gt input input
  • Maven 依赖插件:复制依赖项:排除单个工件

    我需要从 maven dependency plugin copy dependencies 中排除单个工件 在文档上 https maven apache org plugins maven dependency plugin copy
  • set 和 freezeset 的继承行为似乎不同

    有人可以解释以下行为 class derivedset1 frozenset def new cls args return frozenset new cls args class derivedset2 set def new cls