如何从类变量[重复]中引用静态方法

问题描述 投票:5回答:1

上课

from __future__ import annotations
from typing import ClassVar, Dict, Final
import abc

class Cipher(abc.ABC):
    @abc.abstractmethod
    def encrypt(self, plaintext: str) -> str:
        pass

    @abc.abstractmethod
    def decrypt(self, ciphertext: str) -> str:
        pass

class VigenereCipher(Cipher):
    @staticmethod
    def rotate(n: int) -> str:
        return string.ascii_uppercase[n:] + string.ascii_uppercase[:n]

    _TABLE: Final[ClassVar[Dict[str, str]]] = dict({(chr(i + ord("A")), rotate(i)) for i in range(26)})

编译失败(使用3.8.0

../cipher.py:19: in <module>
    class VigenereCipher(Cipher):
../cipher.py:24: in VigenereCipher
    _TABLE: Final[ClassVar[Dict[str, str]]] = dict({(chr(i + ord("A")), rotate(i)) for i in range(26)})
../cipher.py:24: in <setcomp>
    _TABLE: Final[ClassVar[Dict[str, str]]] = dict({(chr(i + ord("A")), rotate(i)) for i in range(26)})
E   NameError: name 'rotate' is not defined

但是,根据this帖子,rotate应该是可解析的。请注意,使用类名称VigenereCipher进行限定也不起作用,因为它找不到VigenereCipher(这很有意义,因为我们正在定义它)。

我可以将rotate设为模块级别的方法,并且可以工作,但是我并不想要这样做,因为仅在VigenereCipher中需要它。

也尝试了this答案,但没有成功。

实际代码是here。单元测试为here

python decorator static-methods class-variables python-typing
1个回答
3
投票
错误从这里引发:

_TABLE: Final[ClassVar[Dict[str, str]]] = dict({(chr(i + ord("A")), rotate(i)) for i in range(26)})

© www.soinside.com 2019 - 2024. All rights reserved.