代码之家  ›  专栏  ›  技术社区  ›  alexgolec

有一个检查输入类型的初始化方法是好的形式吗?

  •  0
  • alexgolec  · 技术社区  · 15 年前

    我有一个类想要从一些可能的输入初始化。然而,由于没有函数重载和我对该语言的相对缺乏经验,我无法确定如何继续。有什么建议吗?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    退房 this question 早些时候问。

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

        2
  •  3
  •   Chris Morgan    15 年前

    对于Python,应该使用duck类型。维基百科在Python中有一个很好的部分 http://en.wikipedia.org/wiki/Duck_typing#In_Python

        3
  •  2
  •   Community Mohan Dere    9 年前

    与其他人的回答相反,在 __init__ . 例如 array.array Python标准库中的类接受可选的 initializer 参数,它可以是列表、字符串或iterable。文档中明确说明了发生的不同操作 基于类型。 再举一个同样的例子 按参数类型 看见 decimal.Decimal . 或者看看 zipfile.Zipfile ,它接受 file 参数“其中文件可以是文件(字符串)的路径,也可以是类似文件的对象。”(这里我们看到显式类型检查(字符串)和duck类型(类似文件的对象)都在一起!)

    如果发现显式类型签入 __初始__ 变得一团糟,尝试另一种方法。改用工厂函数。例如,假设你有一个 triangle 带有 Triangle 上课。有很多方法可以构造三角形。而不是 __初始__ 处理所有这些方法时,可以将工厂方法添加到模块中:

    • triangle.from_sas(side1, angle, side2)
    • triangle.from_asa(angle1, side, angle2)
    • triangle.from_sss(side1, side2, side3)
    • triangle.from_aas(angle1, angle2, side)

    这些工厂方法也可以推广到 三角形 类,使用 @classmethod 装饰工。关于这种技术的一个很好的例子,请看托马斯·沃特对stackoverflow问题的精确回答 overloading init in python .

        4
  •  1
  •   user225312    15 年前

    不,不要显式检查类型。Python是一种duck类型的语言。如果传递了错误的类型,则 TypeError 将被抚养。就这样。你不必为类型操心,那是程序员的责任。