根据输入对象类型的不同,Python函数的行为也不同
在Python中,我是否可以编写一个函数,将对象作为输入,并根据对象的类型执行不同的计算 例如,假设我有两个类:“圆”和“线”。我定义了一个具有半径和中心位置的圆对象a,以及一个具有不同半径和中心位置的圆对象B。然后我定义了一个直线对象C,它有一个方向向量和一个沿直线的点 我想编写一个计算交点的函数:根据输入对象类型的不同,Python函数的行为也不同,python,oop,linear-algebra,Python,Oop,Linear Algebra,在Python中,我是否可以编写一个函数,将对象作为输入,并根据对象的类型执行不同的计算 例如,假设我有两个类:“圆”和“线”。我定义了一个具有半径和中心位置的圆对象a,以及一个具有不同半径和中心位置的圆对象B。然后我定义了一个直线对象C,它有一个方向向量和一个沿直线的点 我想编写一个计算交点的函数: def intersect(obj1,obj2): # Returns intersection of two geometric entities 如果我输入两个圆A和B,我希望函数返
def intersect(obj1,obj2):
# Returns intersection of two geometric entities
如果我输入两个圆A和B,我希望函数返回A和B的相交区域。但是如果我输入圆A和线C,我希望输出是线与圆相交的点(如果有)。因此intersect(obj1、obj2)需要以某种方式读取obj1和obj2的类,并采取相应的行动。是的,您当然可以检测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
是的,您当然可以检测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
从一致的接口角度来看,这不是很明智<代码>相交应返回两种情况下的相交点,然后使用单独的函数获取具有几何意义的重叠区域。这将使您的代码更容易推理。在检查类型方面(请参阅为什么通常不这样做),使用。这更有意义,我将编写它以返回两个圆圈相交的点,我认为这是明智的。然后,您可以查看例如相交点(…)的
:
并知道这是有意义的,而不必担心该点的输入恰好是什么类型的。是否最好只为每种相交定义一个单独的函数?搞砸了。。。我认为从一致的界面角度来看,这不是很聪明<代码>相交应返回两种情况下的相交点,然后使用单独的函数获取具有几何意义的重叠区域。这将使您的代码更容易推理。在检查类型方面(请参阅为什么通常不这样做),使用。这更有意义,我将编写它以返回两个圆圈相交的点,我认为这是明智的。然后,您可以查看例如相交点(…)的:
并知道这是有意义的,而不必担心该点的输入恰好是什么类型的。是否最好只为每种相交定义一个单独的函数?搞砸了。。。我认为,通常您会使用isinstance(x,int)
,来处理子类化、接口实现等。通常您会使用isinstance(x,int)
,来处理子类化、接口实现等。