How can I access a classmethod from inside a class in Python

前端 未结 6 1015
日久生厌
日久生厌 2020-12-03 06:40

I would like to create a class in Python that manages above all static members. These members should be initiliazed during definition of the class already. Due to the fact t

6条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-03 07:39

    This seems like a reasonable solution:

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

    The method is now a static method of the cipher, nothing outside the classes is referenced. You could opt to name RotateCipher _RotateCipher instead, if you don't want people using it by itself.

    Note: I removed the Final, as I ran this on 3.7, but after reading the documentation on Final, I don't think it would affect the solution? Also added an import for string which the question was missing. And finally added an implementation for the abstract methods, alternatively, could have let VigenereCipher inherit from abc.ABC as well.

提交回复
热议问题