Python 我们通过使用不同类型的参数编写相同的方法来实现函数重载

Python 我们通过使用不同类型的参数编写相同的方法来实现函数重载,python,Python,我们通过使用不同类型的参数编写相同的方法来实现函数重载,但调用控件时将其放入if部分而不是elif部分。我们希望使用elif部分实现圆的面积,使用elif部分实现正方形的面积,但调用这两个参数时将其放入if部分 我想你的问题是那些r=无和s=无。至少这确实是一个破坏代码的问题;我不确定是不是你问的那个 这些参数的默认值是0.0和0。两者都不等于None 如果要检查它们是否为非零,可以比较r!=0和s!=0。 …或者可能r!=0.0 …或者可能不是数学.isclose(r,0) 如果您想检查

我们通过使用不同类型的参数编写相同的方法来实现函数重载,但调用控件时将其放入if部分而不是elif部分。我们希望使用elif部分实现圆的面积,使用elif部分实现正方形的面积,但调用这两个参数时将其放入if部分

我想你的问题是那些
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