如何在 Python 中将自定义类设为集合

2024-02-05

我有 Matlab 背景。在 matlab 中,我可以创建一个类定义,然后创建一个对象数组。我可以轻松地使用索引取消引用每个对象。此外,当我从对象数组(没有索引)调用方法时,我可以访问数组中的所有对象。例如,假设 myNewClass 具有属性 .data 和 .text,它还具有方法 .clob。我可以:

% init
a(1) = myNewClass;
a(2) = myNewClass;

a(1).data = [0;0;0];
a(2).data = [1;1;1];

所以现在,如果我调用 a.clob (不是 a(1).clob 或 a(2).clob),我可以做类似的事情

% this is a function inside the methods definition of my class definition
function clob(self)
   % self here is my object array, "a", from above
   for i=1:length(self)
       % deref a single object
       self(i).goClobYourself;
   end
end

我如何在Python中做这样的事情?请注意,我希望我的类成为一个索引集合,有点像列表。但是,我不希望我的“班级列表”接受任何班级,只接受 myNewClass。如果我继承自“list”,我的类将只是一个具有属性 .data、.text 和函数 .clob 的“list”类吗?另请注意,我不需要包含我的对象的“列表”,我希望我的对象是列表,以便我可以从索引中取消引用它们:a[1].clob() 或 a(1).clob( ) (?? 或类似的东西)。或者,我想将整个数组传递给 self:a.clob() 使我可以访问该列表。我可能对术语有点模糊。

此致


使用 Python 编程时,执行类型检查并不常见。您是否确定需要您的列表仅接受一种类型(及其子类型),或者您是否相信程序员会阅读您的文档而不会将不应该存在的内容放入其中?

如果是这样,这里有一个继承自的示例泛型类collections.MutableSequence这可能会做你想要的:

from collections import MutableSequence
class VerifierList(MutableSequence):
    _list = None
    def __init__(self, allowedClasses, *args, **kwargs):
        super(VerifierList, self).__init__()
        self._list = list(*args, **kwargs)
        self.allowedClasses = tuple(allowedClasses)
    def __repr__(self):
        return repr(self._list)
    def __str__(self):
        return str(self._list)
    def __len__(self):
        return len(self._list)
    def __getitem__(self, index):
        return self._list[index]
    def __setitem__(self, index, value):
        if not isinstance(value, self.allowedClasses):
            raise TypeError('Value of type %s not allowed!' % value.__class__.__name__)
        self._list[index] = value
    def __delitem__(self, index):
        del self._list[index]
    def insert(self, index, value):
        if not isinstance(value, self.allowedClasses):
            raise TypeError('Value of type %s not allowed!' % value.__class__.__name__)
        self._list.insert(index, value)

使用方法如下:

>>> class A(object): pass

>>> class B(object): pass

>>> l = VerifierList((A,))
>>> l.append(A())
>>> print(l)
>>> [<__main__.A object at 0x000000000311F278>]
>>> l.append(B())

Traceback (most recent call last):
  File "<pyshell#228>", line 1, in <module>
    l.append(B())
  File "C:\Python27\lib\_abcoll.py", line 661, in append
    self.insert(len(self), value)
  File "<pyshell#204>", line 23, in insert
    raise TypeError('Value of type %s not allowed!' % value.__class__.__name__)
TypeError: Value of type B not allowed!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 中将自定义类设为集合 的相关文章

随机推荐

  • 为什么对文字使用异或而不是反转(按位非)

    我遇到过这个CRC32代码 http www opensource apple com source xnu xnu 1456 1 26 bsd libkern crc32 c很好奇为什么作者会选择使用 crc crc 0U 代替 crc
  • Excel VBA / SQL 联盟

    我正在尝试将 2 个不同工作表中的 2 个单独的列连接起来 以创建一个更长的列 然后我可以从中使用 Vlookup 表1 A B C D E F G 表2 A B C D E F G 我想将sheet1中的B列和sheet2中的C列连接 联
  • SQL 单元测试存储过程

    我是 SQL 数据库的新手 但一直面临着测试我的数据库的问题 出于安全原因 任何查询或更新都是通过存储过程完成的 一位同行建议我使用存储过程来测试其他存储过程 对于对我的存储过程进行单元测试以确保它们正在执行它们应该执行的操作 这是一个好还
  • getAttribute() 和 getParameter() 之间的区别

    有什么区别getAttribute and getParameter 内的方法HttpServletRequest class getParameter 返回http请求参数 这些从客户端传递到服务器 例如http example com
  • 应用商店中的应用大小比上传的应用大小大 7 倍

    当我将 iOS 应用程序上传到应用程序商店时 ipa 大小为32 MB 现在我的应用程序上线了 现在我在应用程序商店上检查了我的应用程序大小 它显示237 MB在 iPhone 6 上 它显示252 MB当我在电脑上的浏览器中打开应用程序链
  • 如何在 SVN 中进行独占结帐?

    我正在寻找一种从 SVN 进行独家结帐的方法 有没有办法在检出文件时自动锁定文件 如果一个用户进行独占签出 然后另一个用户对同一文件进行签出 我如何向第二个用户生成某种通知或即时消息 表明该文件已锁定 您可以添加属性或自动属性svn nee
  • dplyr 计数变量的一个特定值的数量

    假设我有一个这样的数据集 id lt c 1 1 2 2 3 3 code lt c a b a a b b dat lt data frame id code I e id code 1 1 a 2 1 b 3 2 a 4 2 a 5 3
  • 在 Python 中验证 (X)HTML

    验证文档是否遵循某个 HTML 版本 最好是我可以指定 的最佳方法是什么 我希望能够知道失败发生在哪里 就像在基于 Web 的验证器中一样 但在本机 Python 应用程序中除外 PyTidyLib http countergram git
  • 将x和y轴添加到所有facet_wrap

    通常希望尽量减少绘图中的墨水 我有一个多面情节 facet wrap 并希望去除尽可能多的墨水但保持可读性 我已经按照我的意愿进行了设置 除了 x 轴和 y 轴不存在于面 子图 中 除非位于最左侧或底部 去除了这么多墨水后 我相信眼睛需要这
  • 重载解析算法中如何确定歧义?

    我试图理解重载解析方法 为什么这是模棱两可的 void func double int int double void func int double double double void main func 1 2 3 4 但这不是吗 v
  • XCode 警告:“/* 在块注释内”

    我真的很喜欢通过这样注释来临时启用和禁用代码部分 some code 注意 代替 在最后 然而 XCode 不断向我发出警告 within block comment 有没有办法 自定义禁用 特定警告 为什么 我会告诉你为什么 因为我可以轻
  • 如何将 std::max_element 用于结构

    我想用std max element对于结构体VAR T基于id元素 但我无法将起始点和停止点与该函数的输入链接起来 typedef struct VAR int id char b 16 VAR int a 0 strcpy b VAR
  • 如何从警报框中获取文本?

    我需要从警报框中获取文本 我没有足够的声誉来上传图像 所以我上传代码而不是图像 有没有办法使用 Greasemonkey 在 Chrome 上 从弹出窗口 获取文本 查询不清楚 但是如果我理解正确的话 页面上有一个 JavaScript 会
  • JRHtmlExporter 现已弃用。如何定义图片保存路径?

    The JRHtml导出器类现在已弃用 JasperReports 6 x 我将这个类的用法替换为Html导出器 但我找不到等效的函数来替换exporter setParameter JRHtmlExporterParameter IMAG
  • Summernote 图像上传和替代方案不起作用

    我在我的网站上使用 Summernote 编辑器 并使用其网站上提到的 Click2edit 方法实现它here http www usrtriton nl assets bower summernote example html 然而 如
  • 在背景中绘图

    我有一个 IOS 应用程序 需要更新视图以响应用户或外部事件 绘制时间可以很短也可以很长 几秒 具体取决于视图中的内容 现在 绘图是在视图的 drawRect 方法中进行的 当绘图很长且存在大量用户交互时 应用程序将变得无响应 当需要更新时
  • 运行 liquibase 时出现值“CONTINUE”不是构面有效错误

    当我尝试运行以下命令时 java jar liquibase 3 4 1 jar classpath postgresql 9 2 1004 jdbc4 jar logLevel severe url jdbc postgresql loc
  • 是否可以更改 Postgres 中列的自然顺序?

    是否可以更改 Postgres 8 1 中列的自然顺序 我知道你不应该依赖列顺序 它不是基本的到我正在做的事情 我只需要它使一些自动生成的东西以更令人愉悦的方式出现 以便字段顺序从 pgadmin 通过后端一直到前端匹配 实际上 您可以直接
  • 复选框的表单模型绑定

    我正在使用 Laravel 4 1 在我的应用程序中我需要显示一个带有预填充复选框的表单 但我尝试使用表单模型绑定来做到这一点 但它不起作用 Form model user array route gt settings notify di
  • 如何在 Python 中将自定义类设为集合

    我有 Matlab 背景 在 matlab 中 我可以创建一个类定义 然后创建一个对象数组 我可以轻松地使用索引取消引用每个对象 此外 当我从对象数组 没有索引 调用方法时 我可以访问数组中的所有对象 例如 假设 myNewClass 具有