Как реализовать подтипируемый класс в Python (подклассный класс, а не объект подкачки)?
Для реализации объекта, подлежащего индексированию, легко, просто реализуйте __getitem__
в этом определении класса объекта.
Но теперь я хочу реализовать подклассный класс. Например, я хочу реализовать этот код:
class Fruit(object):
Apple = 0
Pear = 1
Banana = 2
#________________________________
#/ Some other definitions, \
#\ make class 'Fruit' subscriptable. /
# --------------------------------
# \ ^__^
# \ (oo)\_______
# (__)\ )\/\
# ||----w |
# || ||
print Fruit['Apple'], Fruit['Banana']
#Output: 0 2
Я знаю, что getattr
может делать то же самое, но я чувствую, что доступ к индексу более элегантный.
Ответы
Ответ 1
Кажется, нужно сменить метакласс. Для Python 2:
class GetAttr(type):
def __getitem__(cls, x):
return getattr(cls, x)
class Fruit(object):
__metaclass__ = GetAttr
Apple = 0
Pear = 1
Banana = 2
print Fruit['Apple'], Fruit['Banana']
# output: 0 2
На Python 3 вы должны напрямую использовать Enum:
import enum
class Fruit(enum.Enum):
Apple = 0
Pear = 1
Banana = 2
print(Fruit['Apple'], Fruit['Banana'])
# Output: Fruit.Apple, Fruit.Banana
print(Fruit['Apple'].value, Fruit['Banana'].value)
# Output: 0 2
Ответ 2
Добавьте в класс что-то подобное:
class Fruit(object):
def __init__(self):
self.Fruits = {"Apple": 0, "Pear": 1, "Banana": 2}
def __getitem__(self, item):
return self.Fruits[item]