如何在 Python 中实现静态属性?

How can I implement a static attribute in Python?

如何使用可共享和可访问的静态属性在 Python 中实现静态 属性 或方法对?

class StaticClass:
    __static_attr: str

    @classmethod
    def set(cls, input__):
        cls.__static_class = input__

    @classmethod
    def get(cls):
        return cls.__static_attr


StaticClass.set("Hello!")
print(StaticClass.get())

输出:

C:\Users\pc\AppData\Local\Microsoft\WindowsApps\python3.7.exe C:/Users/pc/source/repos/main.py
Traceback (most recent call last):
  File "C:/Users/pc/source/repos/main.py", line 15, in <module>
    print(StaticClass.get())
  File "C:/Users/pc/source/repos/main.py", line 11, in get
    return cls.__static_attr
AttributeError: type object 'StaticClass' has no attribute '_StaticClass__static_attr'

Process finished with exit code 1

编辑: 上面的源代码在set()中有错别字。如果该拼写错误得到修复,代码将完美运行。

但是,对于我的原始源代码,该属性是 List[str]。在那种情况下,只有通过一对方括号 [].

初始化属性时,程序才会运行
import os
from typing import List


class SearchFilesInTheDirectory:
    __file_list: List[str] = []

    @classmethod
    def do_indexing_of_files(cls, path, file_extension):
        for root, dirs, files in os.walk(path):
            for file in files:
                if file.endswith(file_extension):
                    cls.__file_list.append(os.path.join(root, file))

    @classmethod
    def get_files_list(cls):
        return cls.__file_list

    @classmethod
    def printf(cls):
        if cls.__file_list is not None:
            for file in cls.__file_list:
                print(file)
        else:
            print("directory is empty")

    @classmethod
    def write_to_file(cls, file_name):
        if cls.__file_list is not None:
            with open(file_name, 'w') as f:
                for f_name in cls.__file_list:
                    f.write("%s\t%s\n" % f_name)
        else:
            print("directory is empty")

最好初始化 class 静态变量,而不仅仅是声明它的类型。这样您甚至可以在 set 之前调用 get,并使其 return 成为默认值:

class StaticClass:
    __static_attr = ""

    @classmethod
    def set(cls, input__):
        cls.__static_attr = input__

    @classmethod
    def get(cls):
        return cls.__static_attr


StaticClass.set("Hello!")
print(StaticClass.get())

此外,您的原始代码似乎有错字,因此 set 方法分配给了您声明的变量以外的变量(__static_class 而不是 __static_attr).因此,由于静态变量未初始化,您的 get 方法失败。