为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只甜甜圈 2019-10-14 10:59:42
假设我有一个类,该类具有一个名为data的成员,该成员是一个列表。我希望能够使用例如文件名(包含用于初始化列表的数据)或实际列表进行初始化的类。您执行此操作的技巧是什么?您只是通过查看来检查类型__class__吗?我可能会缺少一些技巧吗?我习惯C ++,按参数类型重载很容易。
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

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


>>> 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)在于,调用者无法告诉您,例如,即使类型不是基本字符串,您也应将其视为字符串(而不是其他序列)。也许调用者希望为了不同的目的使用相同的类型,有时将其用作单个项目,有时将其作为一系列项目使用。明确的表达消除了所有疑问,并导致了更健壮和更清晰的代码。


查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 395 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信