轻松访问静态 class python 的属性
Easily access properties of a static class python
我在下面定义了一个静态 class,它有两个我将在我的代码中引用的一些默认属性的示例。这个 class 稍后会大得多,但我想要一种将所有这些值保存在一个地方并在多个代码区域访问它们的好方法。
'''
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)
或者这里有更好的数据结构可以使用吗?谢谢。
我不会为此使用 class,将其作为一种方法确实没有意义。使用另一个对象而不是静态方法:
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#... 确实不需要“静态 class”,事实上,这不是标准术语。通常,这只是一个 具有全局级别“常量”的常规模块 ,例如
# in defaults.py
Refractive: MetaData[float] = MetaData(0.5, 1.333, 5.0)
Temp: MetaData[int] = MetaData(10, 23, 40)
我稍微修改了@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
我在下面定义了一个静态 class,它有两个我将在我的代码中引用的一些默认属性的示例。这个 class 稍后会大得多,但我想要一种将所有这些值保存在一个地方并在多个代码区域访问它们的好方法。
'''
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)
或者这里有更好的数据结构可以使用吗?谢谢。
我不会为此使用 class,将其作为一种方法确实没有意义。使用另一个对象而不是静态方法:
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#... 确实不需要“静态 class”,事实上,这不是标准术语。通常,这只是一个 具有全局级别“常量”的常规模块 ,例如
# in defaults.py
Refractive: MetaData[float] = MetaData(0.5, 1.333, 5.0)
Temp: MetaData[int] = MetaData(10, 23, 40)
我稍微修改了@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