theo dõi

Gần nhất :

Tags

Thống kê câu hỏi

Chuyên mục : Lập trình
Topic : Python
Hỏi lúc:
Lượt xem: 2,389

Làm thế nào tôi có thể sử dụng một 'Enum' trong Python?

Võ Tấn Dũng Võ Tấn Dũng
 07  02  00
01 bình chọn hữu ích bởi Tạ Trung Nghĩa

Tôi chủ yếu là một dev C#, nhưng tôi hiện đang làm việc trên một dự án trong Python.

Làm thế nào tôi có thể sử dụng một Enum trong Python?

2,389 xem 07 theo dõi 01 hữu ích hỏi –

Bạn biết ai đó có thể trả lời câu hỏi này?. Bạn có thể giúp đỡ bằng cách tìm những người giỏi nhất:

user user user user user

Ngô Thanh Nga Ngô Thanh Nga
 05  00  01
05 bình chọn hữu ích bởi Phan Ðức Minh, Trịnh Ðức Tường Hồ Thành Ðệ ... (tất cả)

Bạn có thể dùng:

class Enum(set):
    def __getattr__(self, name):
        if name in self:
            return name
        raise AttributeError

Sau đó thực hiện nó:

Animals = Enum(["DOG", "CAT", "HORSE"])
print(Animals.DOG)
2,084 xem 05 hữu ích trả lời –
Hoàng Thanh Vinh Hoàng Thanh Vinh
 02  00  01
02 bình chọn hữu ích bởi Nguyễn Thu Duyên Võ Công Thành

Mình hay sử dụng:

class Enum(object):
    def __init__(self, names, separator=None):
        self.names = names.split(separator)
        for value, name in enumerate(self.names):
            setattr(self, name.upper(), value)
    def tuples(self):
        return tuple(enumerate(self.names))

Cách dùng:

>>> state = Enum('draft published retracted')
>>> state.DRAFT
0
>>> state.RETRACTED
2
>>> state.FOO
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'Enum' object has no attribute 'FOO'
>>> state.tuples()
((0, 'draft'), (1, 'published'), (2, 'retracted'))
2,082 xem 02 hữu ích trả lời –
Huỳnh Hạ Uyên Huỳnh Hạ Uyên
 02  00  01
02 bình chọn hữu ích bởi Nguyễn Ðức Huy Đặng Thành Long
def M_add_class_attribs(attribs):
    def foo(name, bases, dict_):
        for v, k in attribs:
            dict_[k] = v
        return type(name, bases, dict_)
    return foo

def enum(*names):
    class Foo(object):
        __metaclass__ = M_add_class_attribs(enumerate(names))
        def __setattr__(self, name, value):  # this makes it read-only
            raise NotImplementedError
    return Foo()

Sử dụng nó như thế này:

Animal = enum('DOG', 'CAT')
Animal.DOG # returns 0
Animal.CAT # returns 1
Animal.DOG = 2 # raises NotImplementedError

nếu bạn chỉ muốn các ký hiệu duy nhất và không quan tâm về các giá trị, thay thế dòng này:

__metaclass__ = M_add_class_attribs(enumerate(names))

với dòng:

__metaclass__ = M_add_class_attribs((object(), name) for name in names)
2,083 xem 02 hữu ích trả lời –
Hoàng Ngọc Tuấn Hoàng Ngọc Tuấn
 02  00  01
02 bình chọn hữu ích bởi Lý Tuấn Sỹ Đỗ Ðức Anh

Một lớp Enum có thể là:

class Enum(tuple): __getattr__ = tuple.index

Cách sử dụng:

>>> State = Enum(['Unclaimed', 'Claimed'])
>>> State.Claimed
1
>>> State[1]
'Claimed'
>>> State
('Unclaimed', 'Claimed')
>>> range(len(State))
[0, 1]
>>> [(k, State[k]) for k in range(len(State))]
[(0, 'Unclaimed'), (1, 'Claimed')]
>>> [(k, getattr(State, k)) for k in State]
[('Unclaimed', 0), ('Claimed', 1)]
2,084 xem 02 hữu ích trả lời –