Python 我们通过使用不同类型的参数编写相同的方法来实现函数重载
我们通过使用不同类型的参数编写相同的方法来实现函数重载,但调用控件时将其放入if部分而不是elif部分。我们希望使用elif部分实现圆的面积,使用elif部分实现正方形的面积,但调用这两个参数时将其放入if部分 我想你的问题是那些Python 我们通过使用不同类型的参数编写相同的方法来实现函数重载,python,Python,我们通过使用不同类型的参数编写相同的方法来实现函数重载,但调用控件时将其放入if部分而不是elif部分。我们希望使用elif部分实现圆的面积,使用elif部分实现正方形的面积,但调用这两个参数时将其放入if部分 我想你的问题是那些r=无和s=无。至少这确实是一个破坏代码的问题;我不确定是不是你问的那个 这些参数的默认值是0.0和0。两者都不等于None 如果要检查它们是否为非零,可以比较r!=0和s!=0。 …或者可能r!=0.0 …或者可能不是数学.isclose(r,0) 如果您想检查
r=无
和s=无
。至少这确实是一个破坏代码的问题;我不确定是不是你问的那个
这些参数的默认值是0.0
和0
。两者都不等于None
- 如果要检查它们是否为非零,可以比较
r!=0和
。s!=0
- …或者可能
r!=0.0
- …或者可能
不是数学.isclose(r,0)
- …或者可能
- 如果您想检查它们是否真实,则
和零都不是真实的,但非零数字只是检查None
本身r
- 如果要检查它们是否被遗漏在调用之外,则需要将函数定义中的默认值改为
。None
- …但是您应该检查
,而不是是否为None
!=无
- …但是您应该检查
同时,如果同时为这两个传递值,会发生什么?或者两者都没有
此外,如果您希望人们通过
s
而不通过r
,那么唯一的方法就是将其作为关键字参数(除了查看函数定义以查看r
的默认值是什么,然后显式地通过该参数)
那么,也许这些应该是仅关键字参数
综上所述,这里有一个关于你想要什么的猜测:
class area:
def __init__(self):
self.rad = 0.0
self.side = 0
self.length = 0
self.breadth = 0
self.ar1 = 0.0
self.ar2 = 0
self.ar3 = 0
def cal(self,r=0.0,s = 0):
if(r!=None):
self.rad = r
self.ar1 = 3.14*self.rad*self.rad
print(self.ar1)
elif(s!=None):
self.side = s
self.ar2 = self.side*self.side
print(self.ar2)
obj = area()
obj.cal(7.0)
obj.cal(12)
现在:
def cal(self, *, r=None, s=None):
if r is not None:
raise TypeError('cal() needs either r or s')
elif r is not None and s is not None:
raise TypeError('cal() needs only one of r or s')
elif r is not None:
self.rad = r
self.ar1 = 3.14*self.rad*self.rad
print(self.ar1)
else:
self.side = s
self.ar2 = self.side*self.side
print(self.ar2)
但实际上,有一种更简单的方法来完成所有这些:
>>> obj = area()
>>> obj.cal(7.0)
TypeError: cal() takes 1 positional argument but 2 were given
>>> obj.cal()
TypeError: cal() needs either r or s
>>> obj.cal(r=7.0)
153.86
>>> obj.cal(s=12)
144
在定义端和调用端更易于编写和阅读:
def circle(self, r):
# do circle stuff
def square(self, s):
# do square stuff
我不知道你的问题是什么意思,你能再澄清一下吗?此外,您并没有真正重载函数;通过定义两个名称相同但参数不同的函数来重载函数,而不是使用不同的参数调用它们。我不理解函数重载的含义。看起来你想用同样的方法来计算正方形和圆形的面积。这从根本上看似乎设计得不合理。在任何情况下,您是否询问如何将参数传递给
s
关键字参数?您使用的是默认值。s和r永远不会为无。none
(这是一个对象,不是一个值)的正确测试应该是is
,例如如果r不是无:
。我怀疑你在C++中把<代码> NOT/CONT>等同于<代码> null <代码>,这是不正确的。但是bool(None)
是有效的,等同于False
,bool(0)
,因此可以简化条件(不需要括号)。这是一个不应该使用函数重载的示例,因为没有通用代码Area
不应该是一个类,也许Shape
应该是一个父类以及从中派生的矩形和圆形等形状,每个形状都有自己的Area实现。
>>> obj.circle(7)
153.86
>>> obj.square(12)
144