У меня есть концептуальная дилемма Python.
Скажем, у меня есть класс City
, который представляет город в базе данных.Объект City
можно инициализировать двумя способами:
- Целое число (фактически, идентификатор существующего города в базе данных)
- Список свойств (
name
, country
, population
, ...), который сгенерирует новый город в базе данных и получит его идентификатор.
Это означает, что объект City всегда будет иметь идентификатор -либо инициализированный идентификатор, либо вновь созданный идентификатор, полученный из базы данных.
Классический подход Java перегружает конструктор - один конструктор получит один параметр int
, а другойполучит множество строго типизированных параметров.
Мне не удалось найти элегантный способ сделать это в Python:
- Я могу создать базовый класс с помощью одного метода
get_city_id
и извлекаем из него CityFromID
и CityFromNewData
, но это много усилий для обхода этого языкового пробела. - Использование методов класса кажется неудобным .
- Использование конструктора с длинным списком параметров также неудобно: я бы поставили идентификатор города, и альтернативы, и проверьте в методе, что значения имеют только определенное подмножество.
Использование **kargs
кажется очень не элегантным, поскольку в сигнатуре конструктора нет четкого указания требуемоговходных параметров и строк документации просто недостаточно:
class City(object):
def __init__(self, city_id=None, *args, **kargs):
try:
if city_id==None:
self.city_id=city_id
else:
self.city_name=kargs['name']
except:
error="A city object must be instanciated with a city id or with"+\
" full city details."
raise NameError(error)
Есть ли Pythonic, элегантное решение для перегрузки конструктора?
Adam