如何根据参数类型重载__init__方法?

巴尔蒂马克:

假设我有一个类,该类具有一个名为data的成员,该成员是一个列表。

我希望能够使用例如文件名(包含用于初始化列表的数据)或实际列表进行初始化的类。

您执行此操作的技巧是什么?

您只是通过查看来检查类型__class__吗?

我可能会缺少一些技巧吗?

我习惯C ++,按参数类型重载很容易。

托马斯·沃特斯(Thomas Wouters):

获取“替代构造函数”的一种更整洁的方法是使用类方法。例如:

>>> class MyData:
...     def __init__(self, data):
...         "Initialize MyData from a sequence"
...         self.data = data
...     
...     @classmethod
...     def fromfilename(cls, filename):
...         "Initialize MyData from a file"
...         data = open(filename).readlines()
...         return cls(data)
...     
...     @classmethod
...     def fromdict(cls, datadict):
...         "Initialize MyData from a dict's items"
...         return cls(datadict.items())
... 
>>> MyData([1, 2, 3]).data
[1, 2, 3]
>>> MyData.fromfilename("/tmp/foobar").data
['foo\n', 'bar\n', 'baz\n']
>>> MyData.fromdict({"spam": "ham"}).data
[('spam', 'ham')]

它之所以整洁,是因为毫无疑问期望使用哪种类型,并且您不必强迫猜测调用者打算使用它给您的数据类型做什么。问题isinstance(x, basestring)在于,例如,即使类型不是基本字符串,调用者也无法告诉您,即使类型不是基本字符串,您也应将其视为字符串(而不是其他序列)。也许调用者希望为了不同的目的使用相同的类型,有时将其作为单个项目,有时作为一系列项目使用。明确的表达消除了所有疑问,并导致了更健壮和更清晰的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何根据参数指定应调用哪个__init__?

如何选择的参数类型重载方法?

方法__init__参数太多

Python重载__init__

django - 类型错误 __init__ 位置参数

根据参数中向量的类型重载函数

当参数是给定类型的子类时如何调用重载方法?

根据参数是子类型还是超类型来重载方法是丑陋的设计吗?

在__init__方法中传递参数

如何根据类方法的返回类型声明参数类型?

Python - __init__ 参数

如何从以 __init__ 参数为条件的对象实例中删除方法?

使用带参数和不带参数的 __init__ 方法

Python根据__init__值继承魔术方法

如果在类的 __init__ 方法之外没有在其他地方使用参数,如何使用参数?

使用__init__中的参数定义python类方法

django __init__方法导致参数错误

如何在F#中调用因参数类型重载的方法?

如何将参数传递给类中的__init__

如何在类的__init__函数中使用canvas参数?

如何根据参数类型判断功能类型

重载 Typescript 签名,稍后参数类型根据第一个参数类型更改

flowtype:如何按参数计数/类型重载函数返回类型?

如何重载python3中Thread类的__init__函数?

__init__的正确类型注释

根据参数的类,在Smalltalk中使用“重载”方法吗?

在python中,如何根据返回类型重载返回/获取?

有没有一种方法可以根据最终都可以由特定类型表示的参数类型来简化“重载矩阵”?

Mockito:使用类型兼容的参数验证重载方法