2015-11-24 3 views
2

1, я впервые использовал Python версии 2.7, а через установленный модуль enum.Почему наследование не работает хорошо для этого

from enum import Enum 

class Format(Enum): 
    json = 0 
    other = 1 
    @staticmethod 
    def exist(ele): 
     if Format.__members__.has_key(ele): 
      return True 
     return False 

class Weather(Enum): 
    good = 0 
    bad = 1 
    @staticmethod 
    def exist(ele): 
     if Weather.__members__.has_key(ele): 
      return True 
     return False 

Format.exist('json') 

Что хорошо работает, но я хочу улучшить код.

2, поэтому я думал, что лучший способ может быть таким:

from enum import Enum 

class BEnum(Enum): 
    @staticmethod 
    def exist(ele): 
     if BEnum.__members__.has_key(ele)     
      return True 
     return False 

class Format(Enum): 
    json = 0 
    other = 1 

class Weather(Enum): 
    good = 0 
    bad = 1 

Format.exist('json') 

Однако это приводит к ошибке, поскольку BEnum.__members__ является переменной класса.

Как я могу заставить это работать?

ответ

3

Здесь нужно три вещи. Во-первых, вам нужно сделать BEnum наследовать от Enum:

class BEnum(Enum): 

Далее вам нужно сделать BEnum.exist метод класса:

@classmethod 
    def exist(cls,ele): 
     return cls.__members__.has_key(ele) 

Наконец, вам нужно иметь Format и Weather наследоваться от BEnum:

class Format(BEnum): 

class Weather(BEnum): 

С exist является статическим методом, это ca n работает только с определенным классом, независимо от класса, из которого он вызван. Сделав его методом класса, класс, из которого он вызван, автоматически передается в качестве первого аргумента (cls) и может использоваться для доступа к члену.

Here - отличное описание различий между статическими и классными методами.

+0

извините, у меня первый код есть те же ошибки, я его модифицировал. – sungs

+0

ths classmethod работает. Спасибо ! – sungs

Смежные вопросы