首页 > 解决方案 > 轻松访问静态类 python 的属性

问题描述

我在下面定义了一个静态类,它有两个我将在我的代码中引用的默认属性的示例。这个类稍后会更大,但我想要一种将所有这些值保存在一个地方的好方法,并在多个代码区域中访问它们。

'''

class Defaults:

    Refractive: Tuple[float, float, float] = (0.5, 1.333, 5.0)
    Temp: Tuple[int, int, int] = (10, 23, 40)

    @staticmethod
    def Min(property: Tuple[Any, Any, Any]) -> Any:
        return property[0]
    @staticmethod
    def Max(property: Tuple[Any, Any, Any]) -> Any:
        return property[2]
    @staticmethod
    def Default(property: Tuple[Any, Any, Any]) -> Any:
        return property[1]

'''

有没有办法访问这些属性的特定索引,例如:

Defaults.Temp.Min()

而不是这个:

Defaults.Min(Defaults.Temp)

或者这里有更好的数据结构吗?谢谢。

标签: pythonpropertiesstatic

解决方案


我不会为此使用一个类,并且将其作为一种方法真的没有意义。使用另一个对象而不是静态方法:

from typing import NamedTuple, Generic, TypeVar

T = TypeVar("T", int, float)

# it doesn't have to be a namedtuple, either, you could just define a regular class
class MetaData(NamedTuple, Generic[T]): # or a better name
    min: T
    default: T
    max: T

class Defaults:
    Refractive: MetaData[float] = MetaData(0.5, 1.333, 5.0)
    Temp: MetaData[int] = MetaData(10, 23, 40)

然后,你可以这样做:

print(Defaults.Temp.min)

注意,你应该避免Any,它几乎违背了打字的目的!它的基本意思是“不要输入检查这个”。它充当“逃生阀”。

请注意,Python 不是 Java/C#……确实不需要“静态类”,事实上,这不是标准术语。通常,这只是一个具有全局级别“常量”的常规模块,例如

# in defaults.py
Refractive: MetaData[float] = MetaData(0.5, 1.333, 5.0)
Temp: MetaData[int] = MetaData(10, 23, 40)

推荐阅读