Как создать объект "свойство" класса stati c? - PullRequest
1 голос
/ 28 марта 2020

Прежде всего, я прошу прощения, если моя терминология истекла, и это базовый c вопрос, на который ответили миллион раз! Я пытаюсь понять это, не зная, как это называется, поэтому мои поиски не дали ничего полезного ...

Я часто обнаруживаю, что присваиваю определенные "свойства" экземплярам класса в python, который Я хочу изменить и ссылаться позже. Хорошим примером может быть «состояние» экземпляра, как в следующем коде:

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

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

Хотя это, безусловно, работает, оно требует, чтобы свойство представляло собой строку, которая не очень удобна в обслуживании и довольно склонна к ошибка. Есть ли способ присвоения объекта классу, который можно передать атрибуту? Например (и я знаю, что это не работает):

class ExampleWithProperty:
    NORMAL
    CANCELLED

    def __init__()
        self.status = self.NORMAL

b = Example()
print(b.status)
# would expect: ExampleWithProperty.NORMAL or b.NORMAL
b.status = b.CANCELLED
print(b.status)
# would expect: ExampleWithProperty.CANCELLED or b.CANCELLED

Я считаю, что я видел подобную функциональность в других языках, но я не смог придумать, как это сделать в python !

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Я думаю, что вы ищете Enums

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

https://docs.python.org/3/library/enum.html

Редактировать:

from enum import Enum
class Status(Enum):
    NORMAL = 1
    CHANGED = 2

class MyClass:
    def __init__(self):
        self.status = Status.NORMAL


instance = MyClass()
instance.status = Status.CHANGED


0 голосов
/ 28 марта 2020

Чтобы добавить к полезному ответу sergenp, я бы добавил Enum к существующему классу визуально «более чистым» способом, на который будет легче ссылаться извне класса:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...