from abc import ABC, abstractmethod
class IState(ABC):
"""Interface para o padrão de projeto State."""
@abstractmethod
def sucesso_ao_pagar(self) -> None:
pass
@abstractmethod
def despachar_pedido(self) -> None:
pass
@abstractmethod
def cancelar_pedido(self) -> None:
pass
class Pedido:
"""Classe que representa um pedido."""
def __init__(self) -> None:
self.estado_atual = AguardandoPagamentoState(self)
def realizar_pagamento(self) -> None:
self.estado_atual.sucesso_ao_pagar()
def despachar(self) -> None:
self.estado_atual.despachar_pedido()
def cancelar(self) -> None:
self.estado_atual.cancelar_pedido()
def set_estado_atual(self, estado_atual: IState) -> None:
self.estado_atual = estado_atual
def __str__(self) -> str:
return str(self.estado_atual)
class AguardandoPagamentoState(IState):
"""Estado inicial do pedido."""
def __init__(self, meu_pedido: Pedido):
self.pedido = meu_pedido
def sucesso_ao_pagar(self) -> None:
print("Pedido pago com sucesso!")
self.pedido.set_estado_atual(PagoState(self.pedido))
def despachar_pedido(self) -> None:
print("Pedido não pode ser despachado, pois não foi pago!")
def cancelar_pedido(self) -> None:
print("Pedido cancelado com sucesso!")
self.pedido.set_estado_atual(CanceladoState(self.pedido))
这段代码工作正常,但是当我运行 mypy 时,它指出:
Incompatible types in assignment (expression has type "IState", variable has type "AguardandoPagamentoState") [assignment]mypy
既然 AguardandoPagamentoState 类实现了 IState 接口,为什么会产生这个问题?
如果我发表这样的评论
# type: ignore
它停止抛出这个错误,但我想知道如何解决这个问题。 Mypy 应该理解类关系
问题是你为
AguardandoPagamentoState
中的属性建立了Pedido.__init__
的静态类型:
def __init__(self) -> None:
self.estado_atual = AguardandoPagamentoState(self)
但是然后您尝试通过允许在IState
中分配
set_estado_atual
类型的any值来放松它:
def set_estado_atual(self, estado_atual: IState) -> None:
self.estado_atual = estado_atual
AguardandoPagamentoState
可以实现接口,但并不是所有实现接口的类型都是AguardandoPagamentoState
或其子类。您需要明确建立更通用的静态类型:
def __init__(self) -> None:
self.estado_atual: IState = AguardandoPagamentoState(self)