Python 如何仅允许特定类的元素成为iterable的元素(对于自定义类)

Python 如何仅允许特定类的元素成为iterable的元素(对于自定义类),python,class,oop,tuples,Python,Class,Oop,Tuples,在我的例子中,我想定义一个自定义类(称为WordTuple),它是tuple类的一个子类。此自定义元组的元素必须全部属于另一个自定义类(称为Word) 我知道这个问题()是类似的,但答案不是我想要的,也不是我非常清楚的 class Word(str): pass class WordTuple(tuple): # Here whatever is necessary for the elements of this particular tuple # to be al

在我的例子中,我想定义一个自定义类(称为WordTuple),它是tuple类的一个子类。此自定义元组的元素必须全部属于另一个自定义类(称为Word)

我知道这个问题()是类似的,但答案不是我想要的,也不是我非常清楚的

class Word(str):
    pass

class WordTuple(tuple):
    # Here whatever is necessary for the elements of this particular tuple
    # to be all members of the class 'Word'
    pass

因为元组是不可变的,所以在创建元组时只需要验证对象。您可以在自定义模式中执行此操作:

演示:

>WordTuple('a','b')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第4行,新__
TypeError:WordTuple只能包含Word实例
>>>WordTuple(单词('a'),单词('b'))
(‘a’、‘b’)

您不能在init中强制执行它吗?每次初始化此类时,都可以使用isinstance@orizis标准的内置不可变类型在
\uuuuu new\uuuuu
方法中初始化,而不是在
\uuuuu init\uuuuu
中初始化。有更多关于这个@PM2Ring的信息很酷,很高兴知道。谢谢你提醒我!
class WordTuple(tuple):
    def __new__(cls, *objs):
        if not all(isinstance(o, Word) for o in objs):
            raise TypeError('WordTuple can only contain Word instances')
        return super().__new__(cls, objs)
>>> WordTuple('a', 'b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __new__
TypeError: WordTuple can only contain Word instances
>>> WordTuple(Word('a'), Word('b'))
('a', 'b')