【发布时间】:2019-02-27 20:30:25
【问题描述】:
我希望能够定义列表子类的内容必须是什么。该类如下所示。
class A(list):
def __init__(self):
list.__init__(self)
我想包括打字,这样会发生以下情况。
import typing
class A(list: typing.List[str]): # Maybe something like this
def __init__(self):
list.__init__(self)
>> a = A()
>> a.append("a") # No typing error
>> a.append(1) # Typing error
【问题讨论】:
-
您需要泛型类型。请注意,python never 强制执行您的类型注释。您可以使用第三方静态类型检查器,例如
mypy虽然 -
基本上你需要自己实现
MutableSequenceprotocol。我不会从list继承,因为A应该可以在普通list所在的任何地方使用,这意味着可能接受myAobject.append("foo")之类的东西。让A包含一个list作为实例变量,而不是从list继承,并让定义的方法强制执行int-only 限制。 -
(抱歉,我在之前的评论中考虑了整数列表。)
-
@chepner 但是如果我想在我的子类中使用与 list 相同的方法,为什么不直接使用 list 呢?
-
@Interlooper 说
A应该是ints的列表。 Liskov 替换原则说,在任何我想使用list的实例的地方,我都应该能够使用A的实例来代替它。但如果A(例如)应该是ints 的列表,则意味着以下内容无效:a = A(); a.append("foo")。list是任意对象的可变序列;A不是,所以它不应该是list的子类。两个类是否具有相同的接口并不重要,因为语义是非常不同的。
标签: python python-3.x list subclass python-typing