gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:24:55 26 4
gpt4 key购买 nike

给定类(class)

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 .

最佳答案

错误是从这里引发的:

_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

How to reference static method from class variable

Python中的类变量是某个对象,因此它可以引用程序中的任何对象。您可以遵循以下一些习语:

方法一:

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)}

方法 2:

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)}

还有一些方法基于:

您可以在相关topic中找到更详细的解答

关于python - 如何从类变量引用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59474374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com