Проверка, принадлежит ли переменная классу в python
у меня есть небольшой класс, который выглядит следующим образом :
class Gender(object):
MALE = 'M'
FEMALE = 'F'
у меня есть переменная параметра, которая может быть только M или F.Чтобы убедиться, что это только так, я делаю следующее:
>>> parameter = 'M'
>>> if parameter not in (Gender.MALE, Gender.FEMALE)
... print "Invalid parameter"
...
Invalid parameter
>>>
Теперь у меня есть класс, который содержит все штаты в США следующим образом:
class States(object):
ALABAMA = 'AL'
ALASKA = 'AK'
ARIZONA = 'AZ'
ARKANSAS = 'AR'
CALIFORNIA = 'CA'
COLORADO = 'CO'
CONNECTICUT = 'CT'
DELAWARE = 'DE'
DISTRICTOFCOLUMBIA = 'DC'
....
....
как пример выше, мой параметр теперь АЛ.Однако, поскольку в США есть 50 штатов, я не могу практически использовать кортеж с 50 переменными как я использовал выше.Есть ли лучший способ сделать это ? Я читал об isinstance, но это не дало мне ожидаемых результатов.
3 ответов
можно использовать __dict__
свойство, которое составляет класс, например:
In [1]: class Foo(object):
...: bar = "b"
...: zulu = "z"
...:
In [2]: "bar" in Foo.__dict__
Out[2]: True
или при поиске значений используйте __dict__.values()
:
In [3]: "b" in Foo.__dict__.values()
Out[3]: True
как указывает Питер Вуд,vars()
встроенный также может быть использован для извлечения __dict__
:
In [12]: "b" in vars(Foo).values()
Out[12]: True
на __dict__
свойство используется как пространство имен для классов и так вернут все методы,магические методы и частная свойства в классе также, поэтому для надежности вы можете немного изменить свой поиск, чтобы компенсировать.
в вашем случае вы можете использовать classmethod
, например:
class States(object):
ALABAMA = "AL"
FLORIDA = "FL"
@classmethod
def is_state(cls, to_find):
print(vars(cls))
states = [val for key, val in vars(cls).items()
if not key.startswith("__")
and isinstance(val, str)]
return to_find in states
States.is_state("AL") # True
States.is_state("FL") # True
States.is_state("is_state") # False
States.is_state("__module__") # False
обновление
Это явно ответ на вопрос OPs, но читатели также могут быть заинтересованы в Enum
библиотека в Python 3, которая, вполне возможно, будет лучшим контейнером для таких данных.
почему вы не используете словарь? Его намного проще и поиск будет проще.
states = {'AL': 'Alabama', 'AK': 'Alaska' ... }
test_state = 'Foo'
if test_state not in states.keys():
print('{} is not valid input'.format(test_state))
Я бы предложил использовать Enum для определения обоих Gender
и States
.
перечисление если часть стандартной библиотеки Python 3
. Если вы на Python 2
использовать enum34 установить с pip install enum34
.
from enum import Enum
class States(Enum):
ALABAMA = 'AL'
ALASKA = 'AK'
ARIZONA = 'AZ'
ARKANSAS = 'AR'
CALIFORNIA = 'CA'
COLORADO = 'CO'
CONNECTICUT = 'CT'
DELAWARE = 'DE'
DISTRICTOFCOLUMBIA = 'DC'
...
тогда вы можете проверить, является ли переменная одним из состояний по
isinstance(variable, States)