取决于输入对象类型的行为有所不同的Python函数

问题描述:

在Python中,我可以编写一个函数,它将对象作为输入并根据对象的类型执行不同的计算?取决于输入对象类型的行为有所不同的Python函数

例如,假设我有两个类:“circle”和“line”。我定义了一个具有半径和中心位置的圆形对象A,以及具有不同半径和中心位置的圆形对象B.然后,我用一个方向矢量和一条线沿着一个点定义一个线对象C.

我想写出计算相交处的功能:如果我输入了两个圆圈A和B,我希望函数返回A和B.但如果交集区域

def intersect(obj1,obj2): 
    # Returns intersection of two geometric entities 

我输入A圈和C行,我希望输出成为线条穿过圆圈的点(如果有的话)。所以相交(obj1,obj2)将需要以某种方式读取obj1和obj2的类,并相应地采取行动。

+2

从一致的界面角度来看,这并不是很聪明。 'intersect'应该例如在任何一种情况下都返回相交点,然后有一个单独的函数来获得重叠区域,在这种情况下,这是一种几何上的意义。这会让你的代码更容易推理。在检查类型方面(请参阅[duck typing]](https://docs.python.org/3/glossary.html#term-duck-typing),为什么你通常不这样做),使用['isinstance' ](https://docs.python.org/3/library/functions.html#isinstance)。 – jonrsharpe

+0

这样做更有意义,我会写它以返回圆圈交叉的两点 – Vermillion

+1

我认为这是明智的。然后你可以看看例如交叉点(...)中的点:并且知道它是有意义的,而不必担心在那点输入的是什么类型。 – jonrsharpe

是的,你当然可以检测到你的Python对象的类型,并根据它执行不同的行为。内置的type()方法将提供您需要的信息。

我应该强调,这是相当回到程序范式,而你可能会更好地研究面向对象(特别是多态)。

你也可以从一个函数返回任意类型,所以在一种情况下返回两个圆的二维交点,另一个圆和线之间的两个交点也是可行的。

再一次,这是处理的可能性,而不是智慧。我可以尝试用鳕鱼砍伐一棵巨大的卡里树,但这种举动的智慧至多是可疑的。

通过举例的方式,下面的程序显示了如何返回不同类型的值的基础上,在传递的参数的类型:

def fn(x): 
    if type(x) is int: 
     return 42 
    if type(x) is list: 
     return [3.14159,2.71828] 
    return None 

print(fn(1)) 
print(fn([1,2])) 
print(fn(42.7)) 

是,如所预期的输出:

42 
[3.14159,2.71828] 
None 
+4

通常,您会使用'isinstance(x,int)'来处理子类,接口实现等。 – jonrsharpe