Python “如何创建静态类”;不动产;对象

Python “如何创建静态类”;不动产;对象,python,oop,Python,Oop,首先,如果我的术语太离谱,我道歉,这是一个已经回答了一百万次的基本问题!我在不知道它叫什么的情况下试图弄明白这一点,所以我的搜索没有找到任何有用的东西 我经常发现自己在python中将某些“属性”分配给类实例,稍后我将对这些类实例进行修改和引用。一个很好的例子是实例的“状态”,如以下代码所示: class Example: def __init__(): self.status = "NORMAL" a = Example() print(a.status) a.sta

首先,如果我的术语太离谱,我道歉,这是一个已经回答了一百万次的基本问题!我在不知道它叫什么的情况下试图弄明白这一点,所以我的搜索没有找到任何有用的东西

我经常发现自己在python中将某些“属性”分配给类实例,稍后我将对这些类实例进行修改和引用。一个很好的例子是实例的“状态”,如以下代码所示:

class Example:
    def __init__():
        self.status = "NORMAL"

a = Example()
print(a.status)
a.status = "CANCELLED"
print(a.status)
虽然这确实有效,但它要求属性是一个字符串,该字符串不易维护,并且很容易出错。是否有某种方法将对象分配给可以传递给属性的类?例如(我知道这是行不通的):


我相信我在其他语言中也看到过类似的功能,但我想不出如何在python中做到这一点

我想你在找枚举

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...

编辑:

从枚举导入枚举
类状态(枚举):
正常值=1
已更改=2
类别MyClass:
定义初始化(自):
self.status=status.NORMAL
instance=MyClass()
instance.status=status.CHANGED

要添加到sergenp的有用答案中,我将以一种直观的“更干净”的方式将枚举添加到现有类中,这将更容易从类外引用:

class Example():
    class StatusOptions(Enum):
        NORMAL = 0
        CANCELLED = 1

    def __init__(self):
        self.NORMAL = self.StatusOptions.NORMAL
        self.CANCELLED = self.StatusOptions.CANCELLED

        self.status = self.StatusOptions(self.NORMAL)

a = Example()
print(a.status)
a.status = a.CANCELLED
print(a.status)

print(a.status == a.CANCELLED)

值得一提的是,这与stdlib模块使用的技术相同,例如,
re.MULTILINE
类RegexFlag(enum.IntFlag)
Hmm似乎是正确的想法,但我很难将enum(grammer?)添加到现有类中。我从文档中看到了如何从枚举创建新类,但是如果我已经有了一个要添加到的类,该怎么办?你能试着用这个功能修改我的示例代码吗?@Spencer我已经编辑了答案,包含了一个你想在上面构建的示例,并发布了我自己的答案,以便更好地匹配我的原始问题。如果你有时间的话,我希望你能回顾一下我的想法,以确保它都是犹太的!如果你愿意,我可以删除这个答案,然后编辑你的答案。@martineau为什么要编辑?这看起来非常特定于python……斯宾塞:因为它不是多余的。请参阅常见问题解答:为什么要将它们设置为实例属性?我的意思是它们不应该是类属性吗?
class Example():
    class StatusOptions(Enum):
        NORMAL = 0
        CANCELLED = 1

    def __init__(self):
        self.NORMAL = self.StatusOptions.NORMAL
        self.CANCELLED = self.StatusOptions.CANCELLED

        self.status = self.StatusOptions(self.NORMAL)

a = Example()
print(a.status)
a.status = a.CANCELLED
print(a.status)

print(a.status == a.CANCELLED)