Python 有一个检查其输入类型的_init__方法是一种好形式吗?

Python 有一个检查其输入类型的_init__方法是一种好形式吗?,python,Python,我有一个类,它希望通过一些可能的输入进行初始化。然而,无函数重载和我对该语言相对缺乏经验的结合让我不确定如何继续。有什么建议吗 对于Python,应该使用duck类型。Wikipedia在Python中有一个很好的使用章节,请参见前面的提问 简而言之,建议您使用orisinstance(),classmethods备受青睐。不,不要显式检查类型。Python是一种鸭子类型的语言。如果传递了错误的类型,将引发TypeError。就这样。您不必担心类型,这是程序员的责任。与其他人的回答相反,在\uu

我有一个类,它希望通过一些可能的输入进行初始化。然而,无函数重载和我对该语言相对缺乏经验的结合让我不确定如何继续。有什么建议吗

对于Python,应该使用duck类型。Wikipedia在Python中有一个很好的使用章节,请参见前面的提问


简而言之,建议您使用or
isinstance()
,classmethods备受青睐。

不,不要显式检查类型。Python是一种鸭子类型的语言。如果传递了错误的类型,将引发
TypeError
。就这样。您不必担心类型,这是程序员的责任。

与其他人的回答相反,在
\uuuu init\uuu
中检查类型并不罕见。例如,Python标准库中的类接受可选的
初始值设定项
参数,该参数可以是列表、字符串或iterable。文档明确说明了根据类型发生的不同操作。有关按参数类型进行相同处理的另一个示例,请参见。或者参见,它接受一个
file
参数“其中file可以是文件(字符串)的路径,也可以是类似文件的对象。”(这里我们看到显式类型检查(字符串)和duck类型检查(类似文件的对象)都是一体的!)

如果您发现
\uuuu init\uuuu
中的显式类型检查变得混乱,请尝试另一种方法。改用工厂函数。例如,假设您有一个带有
triangle
类的
triangle
模块。有很多方法可以构成一个三角形。您可以将工厂方法添加到模块中,而不是让
\uuuuu init\uuuu
处理所有这些方法:

  • 三角形。从侧面(侧面1,角度,侧面2)
  • 三角形。从(角度1,侧面,角度2)
  • triangle.from_sss(边1、边2、边3)
  • 三角形。从(角度1,角度2,侧面)

还可以使用
@classmethod
装饰器将这些工厂方法滚动到
三角形
类中。关于这项技术的一个很好的例子,请参见Thomas Wouter对stackoverflow问题的完美回答。

Thomas Wouter在该链接上的公认答案非常好(比盲目建议使用duck打字要好得多),但就目前情况而言,我认为您的回答应该是一个评论。也许你应该添加一些更多的信息,例如,提到类方法在这类事情上的使用。@aaronasterling:谢谢,在这些情况下,我仍然在学习什么是适当的礼仪。