如何从类变量引用静态方法

阿比吉特·萨卡(Abhijit sarkar)

给定班级

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

但是,根据这篇文章,rotate应该可以解决。请注意,使用类名进行限定VigenereCipher也不起作用,因为找不到它VigenereCipher(这很有意义,因为我们正在定义它)。

我可以创建rotate一个模块级方法,并且该方法行得通,但是我真的不想这么做,因为它只在中需要VigenereCipher

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

实际代码在这里单元测试在这里

面容者

错误是从这里引发的:

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

您试图引用rotate位于类命名空间中的变量但是python理解有其自己的范围,没有简单的方法将其与类名称空间连接。rotate理解力评估时没有闭包或全局变量-因此NameError被调用。上面的代码与您的代码相同:

def _create_TABLE():
    d = {}
    for i in range(26):
        d[chr(i + ord("A"))] = rotate(i) # -> NameError('rotate')
    return d
_TABLE: Final[ClassVar[Dict[str, str]]] = dict(_create_TABLE())
del _create_TABLE

如何从类变量引用静态方法

python中的类变量是某个对象,因此它可以引用程序中的任何对象。您可以按照以下习惯用法进行操作:

方法1:

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

    _TABLE: Final[ClassVar[Dict[str, str]]]

VigenereCipher._TABLE = {chr(i + ord("A")): VigenereCipher.rotate(i) for i in range(26)}

方法二:

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

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

方法3:

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(zip(
        (chr(i + ord("A")) for i in range(26)),
        map(rotate.__func__, range(26)),
    ))

方法4:

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

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

也有基于以下方法:

您可以在相关主题中找到更详细的答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在类静态成员中引用静态变量?

来自分类Dev

如何从静态方法中引用非静态变量?

来自分类Dev

如何在 Python 中引用静态类变量?

来自分类Dev

从静态变量引用静态方法

来自分类Dev

如何在静态类方法中引用提供者?

来自分类Dev

如何从父类构造函数引用重写的静态方法?

来自分类Dev

如何引用静态类在其上调用方法?

来自分类Dev

如何从父类构造函数引用重写的静态方法?

来自分类Dev

C++ 类方法包含对静态变量的未定义引用

来自分类Dev

Python:如果静态类变量获得不同的函数引用指针,该如何解决?

来自分类Dev

如何通过动态引用其静态变量来更改父类的属性?

来自分类Dev

使用无引用的NON静态类方法

来自分类Dev

如何从Python类中引用静态属性?

来自分类Dev

如何从XAML引用静态类字段

来自分类Dev

如何从另一个类的静态方法更改静态变量的值

来自分类Dev

如何从另一个类的静态方法更改静态变量的值

来自分类Dev

如何从静态方法ES6类返回非静态变量

来自分类Dev

如何在不指定基类名称的情况下从子基类静态方法引用基类的父类

来自分类Dev

在类变量中引用类方法

来自分类Dev

在类方法Javascript中引用类变量

来自分类Dev

在Android的静态类中引用非静态方法-getSharedPref

来自分类Dev

如何将类方法分配给默认属性(即从静态范围引用非静态方法)

来自分类Dev

是否可以在静态类中引用方法而不引用该类?

来自分类Dev

如何装饰类或静态方法

来自分类Dev

对静态库中的类变量的未定义引用

来自分类Dev

使用静态变量在Objective C中引用类的实例?

来自分类Dev

Python:未解析的静态变量对类的引用

来自分类Dev

在python类中引用整数作为静态变量

来自分类Dev

替换静态类以打包方法和变量

Related 相关文章

  1. 1

    如何在类静态成员中引用静态变量?

  2. 2

    如何从静态方法中引用非静态变量?

  3. 3

    如何在 Python 中引用静态类变量?

  4. 4

    从静态变量引用静态方法

  5. 5

    如何在静态类方法中引用提供者?

  6. 6

    如何从父类构造函数引用重写的静态方法?

  7. 7

    如何引用静态类在其上调用方法?

  8. 8

    如何从父类构造函数引用重写的静态方法?

  9. 9

    C++ 类方法包含对静态变量的未定义引用

  10. 10

    Python:如果静态类变量获得不同的函数引用指针,该如何解决?

  11. 11

    如何通过动态引用其静态变量来更改父类的属性?

  12. 12

    使用无引用的NON静态类方法

  13. 13

    如何从Python类中引用静态属性?

  14. 14

    如何从XAML引用静态类字段

  15. 15

    如何从另一个类的静态方法更改静态变量的值

  16. 16

    如何从另一个类的静态方法更改静态变量的值

  17. 17

    如何从静态方法ES6类返回非静态变量

  18. 18

    如何在不指定基类名称的情况下从子基类静态方法引用基类的父类

  19. 19

    在类变量中引用类方法

  20. 20

    在类方法Javascript中引用类变量

  21. 21

    在Android的静态类中引用非静态方法-getSharedPref

  22. 22

    如何将类方法分配给默认属性(即从静态范围引用非静态方法)

  23. 23

    是否可以在静态类中引用方法而不引用该类?

  24. 24

    如何装饰类或静态方法

  25. 25

    对静态库中的类变量的未定义引用

  26. 26

    使用静态变量在Objective C中引用类的实例?

  27. 27

    Python:未解析的静态变量对类的引用

  28. 28

    在python类中引用整数作为静态变量

  29. 29

    替换静态类以打包方法和变量

热门标签

归档