Python:** kargs而不是重载?

我有一个概念性的Python设计困境.

假设我有一个City类,它代表数据库中的一个城市. City对象可以通过两种方式初始化:

>整数(实际上是数据库中现有城市的ID)
>属性列表(名称,国家/地区,人口……),它将在数据库中生成新城市并检索其ID.

这意味着City对象将始终具有ID – 初始化ID或从数据库派生的新创建ID.

经典的Java方法将是overload the constructor – 一个构造函数将获得单个int参数,另一个将获得许多强类型参数.

我在Python中找不到一种优雅的方法:

>我可以用单个方法get_city_id创建一个基类,并派生出CityFromID和
CityFromNewData来自它,但要解决这种语言缺陷需要付出很多努力.
>使用类方法seems awkward.
>使用带有长参数列表的构造函数也很尴尬:我将两个城市ID和替代品放在一起,并在方法中验证只有特定子集具有值.

使用** 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,优雅的构造函数重载解决方案?

亚当

最佳答案
怎么样:

class City(object):
   def __init__(self, name, description, country, populations):
      self.city_name = name
      # etc.

   @classmethod
   def from_id(cls, city_id):
       # initialise from DB 

然后你可以做普通的对象创建:

 >>> c = City('Hollowberg', '', 'Densin', 3)
 >>> c.id
 1233L

 >>> c2 = City.from_id(1233)

~~~~~~

您也可以查看SQLAlchemy(和Elixir)以获得更好的方法来完成这些工作

转载注明原文:Python:** kargs而不是重载? - 代码日志