这似乎是一个合理的解决方案:
from __future__ import annotations
from typing import ClassVar, Dict
import abc
import string
class Cipher(abc.ABC):
@abc.abstractmethod
def encrypt(self, plaintext: str) -> str:
pass
@abc.abstractmethod
def decrypt(self, ciphertext: str) -> str:
pass
class RotateCipher(Cipher, abc.ABC):
@staticmethod
def rotate(n: int) -> str:
return string.ascii_uppercase[n:] + string.ascii_uppercase[:n]
class VigenereCipher(RotateCipher):
_TABLE: ClassVar[Dict[str, str]] = dict({(chr(i + ord("A")), RotateCipher.rotate(i)) for i in range(26)})
def encrypt(self, plaintext: str) -> str:
pass
def decrypt(self, plaintext: str) -> str:
pass
vc = VigenereCipher()
该方法现在是密码的静态方法,没有引用类之外的任何内容。RotateCipher
_RotateCipher
如果您不希望人们自己使用它,您可以选择命名。
注意:我删除了Final
, 因为我在 3.7 上运行它,但是在阅读了 Final 的文档后,我认为它不会影响解决方案?string
还添加了一个缺少问题的导入。最后为抽象方法添加了一个实现,或者,也可以让 VigenereCipher 继承自abc.ABC
。