gpt4 book ai didi

python - 实现两个构造函数的最pythonic方式

转载 作者:行者123 更新时间:2023-11-28 21:24:49 24 4
gpt4 key购买 nike

请原谅 Python 新手在风格上的无能。

我有一个类采用一个参数来建立初始数据。初始数据的输入方式有两种:字符串列表或包含字符串键和整数值的字典。

现在我只实现了一个版本的构造函数,那个以字典为参数,以 {} 作为默认值。列表参数init作为方法实现,即

myClass = MyClass()
myClass.initList(listVar)

我当然可以接受这个,但这肯定不是完美的。所以,我决定在这里寻求一些 Pythonic 的智慧:应该如何实现这样的多态构造函数?我是否应该尝试读取 initData.keys() 而失败,以便嗅探这是否是字典?或者嗅探参数类型以实现设计不受欢迎的糟糕多态性被认为是非 pythonic 的?

最佳答案

在理想情况下,您会编写一个构造函数,它可以采用 listdict 而不知道其中的区别(即 duck typed)。当然,这不太现实,因为它们是完全不同的鸭子。

同样可以理解的是,您对检查实际实例类型的想法有点心痛,因为它打破了鸭子类型的想法。但是,在 python 2.6 中引入了一个名为 abc 的有趣模块,它允许定义“抽象基类”。要被视为抽象基类的实例,实际上不必继承它,而只需要实现它的所有抽象方法。

collections 模块包括一些抽象基类,在这里您可能会感兴趣,即collections.Sequencecollections.Mapping。因此,您可以像这样编写 __init__ 函数:

def __init__(self, somedata):
if isinstance(somedata, collections.Sequence):
# somedata is a list or some other Sequence
elif isinstance(somedata, collections.Mapping):
# somedata is a dict or some other Mapping

http://docs.python.org/2/library/collections.html#collections-abstract-base-classes包含每个 ABC 提供的方法的细节。如果您坚持这些,那么您的代码现在可以接受适合这些抽象基类之一的任何对象。而且,就采用内置的 dictlist 类型而言,您可以看到:

>>> isinstance([], collections.Sequence)
True
>>> isinstance([], collections.Mapping)
False
>>> isinstance({}, collections.Sequence)
False
>>> isinstance({}, collections.Mapping)
True

而且,几乎是偶然的,你刚刚让它也适用于 tuple。您可能并不关心它是否真的是一个列表,只是您可以从中读取元素。但是,如果您检查了 isinstance(somedata, list),您就会排除 tuple。这就是使用 ABC 给您带来的好处。

关于python - 实现两个构造函数的最pythonic方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15434279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com