在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,这取决于您是否希望通过命令行开关优化检查(可以关闭断言)。谢谢您的回答。这是我心中的想法,但我不确定这是否也是一条路。我不知道静态类型,我会检查文档。静态类型工作得很好,但还是比较新的,所以不是每个深奥的方面都被完全覆盖。就你的情况而言,它应该很有效。