Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python容器中约束类型和属性_Python_Oop_Containers - Fatal编程技术网

在python容器中约束类型和属性

在python容器中约束类型和属性,python,oop,containers,Python,Oop,Containers,我想构建一个容器来存储对象,并且我想约束容器只存储相同类型(类型未事先定义)和不同属性(例如,在下面的示例中,name,以便它可以作为索引)的对象 下面是一个预期行为的示例,假设容器来自列表对象 obj1 = Foo(name='Jon') obj2 = Foo(name='Doe') obj3 = Foo(name='Jon') obj4 = Bar(name='Bob') >>> MyContainer() [] >>> MyContainer([obj

我想构建一个容器来存储对象,并且我想约束容器只存储相同类型(类型未事先定义)和不同属性(例如,在下面的示例中,
name
,以便它可以作为索引)的对象

下面是一个预期行为的示例,假设容器来自
列表
对象

obj1 = Foo(name='Jon')
obj2 = Foo(name='Doe')
obj3 = Foo(name='Jon')
obj4 = Bar(name='Bob')

>>> MyContainer()
[]
>>> MyContainer([obj1, obj2])
[Foo(name='Jon'), Foo(name='Doe')]
>>> MyContainer([obj1, obj4])
TypeError: mixed types
>>> MyContainer([obj1, obj3])
ValueError: Same 'name' attribute
无论使用何种方法填充容器,我都希望此行为保持不变:
\uuuuuu init\uuuuuuu
\uuuuuuuu add\uuuuuuuu
\uuuuuuuuuuuuu
append

但是,如果可能的话,我希望一个空容器可以容纳任何类型的文件,只要它们都是一样的


我想知道应该以什么样的方式来实施它,我正在寻求建议。到目前为止,我想从
列表中导出它,然后重写这些方法,但我对此感到不舒服。我应该装饰它吗?我应该从头开始构建容器吗?现有的容器是否符合我的目的(一种dict或pandas.Dataframe)?

您可以从
列表
派生您的类来实现这一点,然后在可能进入实例的所有点检查输入的内容是否为
Foo

class Foo: pass

class FooList(list):
  def __init__(self, elements):
    assert all(isinstance(element, Foo) for element in elements)
    super().__init__(elements)

  def append(self, element):
    assert isinstance(element, Foo)
    super().append(element)

  def __add__(self, other):
    return FooList(super().__add__(other))  # will do the checks implicitly
这将仅在创建时检查。您现在可以继续并覆盖所有其他点(
\uu iadd\uuu()
\uuuu setitem\uuuuu()
,…)并在那里引入检查

我当前的实现只检查元素的类型。当然,你可以检查更多的东西,比如检查你提到的相同的名字


不过,就类型而言,我不确定这是一个好办法。改为使用Python的静态类型如何?这不会在运行时带来太多开销。

为什么需要这个?也许``collections.abc.MutableSequence`是一个很好的起点…@internetu\u user我可以使用这样一个容器来简化一段长代码,其中我使用
list
以这种方式存储对象。我有很多容器,但所有容器都包含相同类型的对象,这些对象的属性只能是唯一的。当然,您可以提出
ValueError()
而不是
assert,这取决于您是否希望通过命令行开关优化检查(可以关闭断言)。谢谢您的回答。这是我心中的想法,但我不确定这是否也是一条路。我不知道静态类型,我会检查文档。静态类型工作得很好,但还是比较新的,所以不是每个深奥的方面都被完全覆盖。就你的情况而言,它应该很有效。