【问题标题】:Easily access properties of a static class python轻松访问静态类 python 的属性
【发布时间】:2021-12-15 07:13:39
【问题描述】:

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

'''

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)

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

【问题讨论】:

  • 什么是“静态类”?这可能不应该是一个类。
  • 你的意思是Defaults.Temp
  • @juanpa.arrivillaga 是的,很抱歉打错了

标签: python properties static


【解决方案1】:

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

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)

【讨论】:

  • 这个答案似乎完成了我想做的事情。我收到一个 mypy 错误,但声明:“元数据”的参数 1 具有不兼容的类型“浮点数;预期的“T”关于此的想法?谢谢!
  • 忽略我的问题,看我的回答。谢谢!
【解决方案2】:

我稍微修改了@juanpa.arrivullaga 对以下内容的回答,它可以按照我的意愿工作。不确定我从他们的答案中得到的错误,详细信息在我对他们的回答的评论中,但下面的解决方案对我有用。感谢@juanpa.arrivillaga :)

class IntData(NamedTuple):
    """Tuple(Minimum, Default, Maximum) Int"""
    Min: int
    Default: int
    Max: int


class FloatData(NamedTuple):
    """Tuple(Minimum, Default, Maximum) Float"""
    Min: float
    Default: float
    Max: float


class ProtocolDefaults:
    RI: FloatData = FloatData(0.5, 1.333, 5.0)
    Temperature: IntData = IntData(10, 23, 40)


class SettingDefaults:
    CT: FloatData = FloatData(20, 25, 30)

通过以下方式访问元素:

ProtocolDefaults.Temperature.Min

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多