Python 3.x 如何向枚举变量添加getter和setter?

Python 3.x 如何向枚举变量添加getter和setter?,python-3.x,enums,getter-setter,Python 3.x,Enums,Getter Setter,我有一个小的(为了这个问题的目的简化的)类,例如: class ShortStatus1: class Shutter(Enum): CLOSED = '0', ErrorType.NONE OPEN = '1', ErrorType.NONE def __init__(self): self.shutter = ShortStatus1.Shutter.OPEN sh = ToTLMShort() sh.shutter.set

我有一个小的(为了这个问题的目的简化的)类,例如:

class ShortStatus1:
    class Shutter(Enum):
        CLOSED = '0', ErrorType.NONE
        OPEN = '1', ErrorType.NONE

    def __init__(self):
        self.shutter = ShortStatus1.Shutter.OPEN
sh = ToTLMShort()
sh.shutter.set(ShortStatus1.Shutter.CLOSED)
print(sh.shutter.get())
如果可能的话,我想向变量本身添加一个getter和setter,例如:

class ShortStatus1:
    class Shutter(Enum):
        CLOSED = '0', ErrorType.NONE
        OPEN = '1', ErrorType.NONE

    def __init__(self):
        self.shutter = ShortStatus1.Shutter.OPEN
sh = ToTLMShort()
sh.shutter.set(ShortStatus1.Shutter.CLOSED)
print(sh.shutter.get())
将打印<代码>快门。关闭

我的问题是,我不明白如何用这种方式将
self.shutter
封装在getter和setter中(如果可能,我希望避免
sh.set\u shutter(ShortStatus1.shutter.CLOSED)
签名)。
setter很重要,因为它使我能够确保给定的变量是正确的类型,并避免用户错误(代码将被许多具有不同专业水平的人使用)


是否有一种简单的方法来实现此目的,或者我是否需要添加一个额外的类来封装变量?

您可以使用
@property
装饰器和
shutter
类属性前面:

def __init__(self):
    self._shutter = ShortStatus1.Shutter.OPEN

@property
def shutter(self):
    return self._shutter

@shutter.setter
def shutter(self, value):
    self._shutter = value
然后,如果您这样做:

if __name__ == '__main__':
    a = ShortStatus1()
    print(a.shutter)
    a.shutter = ShortStatus1.Shutter.CLOSED
    print(a.shutter)
输出:

Shutter.OPEN
Shutter.CLOSED

您可以使用
@属性
装饰器和
快门
类属性前面:

def __init__(self):
    self._shutter = ShortStatus1.Shutter.OPEN

@property
def shutter(self):
    return self._shutter

@shutter.setter
def shutter(self, value):
    self._shutter = value
然后,如果您这样做:

if __name__ == '__main__':
    a = ShortStatus1()
    print(a.shutter)
    a.shutter = ShortStatus1.Shutter.CLOSED
    print(a.shutter)
输出:

Shutter.OPEN
Shutter.CLOSED

你能解释一下你的问题/困惑吗?使用getter/setter的惯用方法是在类定义中应用
property
ShortStatus1
。不需要添加额外的类,并且它与作为枚举的属性类型没有关系。可能的重复可以解释您的问题/困惑吗?使用getter/setter的惯用方法是在类定义中应用
property
ShortStatus1
。不需要添加额外的类,它与作为枚举的属性类型没有关系。