<p>在更静态的语言中,您可以创建<code>Store</code>作为泛型类,并在从<code>Store</code>继承时使用<code>Car</code>作为类型参数。你知道吗</p>
<p>实际上,我们可以使用python中的<code>typing</code>模块来实现这一点。你知道吗</p>
<p>下面是一个简单的例子:</p>
<pre><code>from typing import Generic, TypeVar
T = TypeVar('T') # this is the generic placeholder for a type
# Store is a generic class with type parameter T
class Store(Generic[T]):
def get(self) -> T: # this returns a T
return self.load_object()
def load_object(self) -> T: # this also returns a T
raise NotImplementedError
class Car:
def __init__(self, color):
self.color = color
# Now we inherit from the Store and use Car as the type parameter
class CarStore(Store[Car]):
def load_object(self):
return Car('red')
s = CarStore()
c = s.get()
print(c.color) # Code completion works and no warnings are shown
</code></pre>
<p><strong>编辑:</strong></p>
<p>为了解决ShadowRanger的问题:如果您希望Car和所有产品都有一个公共基类,那么可以使用<code>bound</code>的<code>TypeVar</code>参数。谢谢您胡安帕.阿里维拉加为了提示。你知道吗</p>
<p>所以我们创建一个产品类并将<code>TypeVar</code>绑定到它。你知道吗</p>
<pre><code>class Product:
def get_id(self):
raise NotImplementedError
T = TypeVar('T', bound=Product)
</code></pre>
<p>Mypy现在会抱怨:</p>
<pre><code>class CarStore(Store[Car]):
def load_object(self):
return Car('red')
</code></pre>
<p>因为<code>Car</code>不是<code>Product</code>。所以让我们也改变一下:</p>
<pre><code>class Car(Product):
def get_id(self):
return ...
def __init__(self, color):
self.color = color
</code></pre>
<p>现在,玛比很高兴。你知道吗</p>
<p>编辑2:</p>
<p>下面是带有更多注释的完整代码,这些注释甚至使<code>mypy strict</code>感到高兴。你知道吗</p>
<pre><code>from typing import Generic, TypeVar
class Product:
def get_id(self) -> int:
raise NotImplementedError
T = TypeVar('T', bound=Product)
class Store(Generic[T]):
def get(self) -> T:
return self.load_object()
def load_object(self) -> T:
raise NotImplementedError
class Car(Product):
def get_id(self) -> int:
return hash(self.color)
def __init__(self, color: str):
self.color = color
class CarStore(Store[Car]):
def load_object(self) -> Car:
return Car('red')
if __name__ == '__main__':
s = CarStore()
c = s.get()
print(c.color)
</code></pre>