python中一个类中具有相同名称的方法?

use*_*618 45 python overloading

如何声明一些具有相同名称但在一个类中具有不同数量的参数或不同类型的方法?

我必须在这堂课中改变一下:

class MyClass:
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
    def my_method(self,parameter_A_that_Must_Be_String):
        print parameter_A_that_Must_Be_String

    def my_method(self,parameter_A_that_Must_Be_String,parameter_B_that_Must_Be_String):
        print parameter_A_that_Must_Be_String
        print parameter_B_that_Must_Be_String

    def my_method(self,parameter_A_that_Must_Be_String,parameter_A_that_Must_Be_Int):
        print parameter_A_that_Must_Be_String * parameter_A_that_Must_Be_Int
Run Code Online (Sandbox Code Playgroud)

kef*_*hou 62

你可以拥有一个接受可变数量参数的函数.

def my_method(*args, **kwds):
    # do something

# when you call the method
my_method(a1, a2, k1=a3, k2=a4)

# you get: 
args = (a1, a2)
kwds = {'k1':a3, 'k2':a4}
Run Code Online (Sandbox Code Playgroud)

所以你可以修改你的功能如下:

def my_method(*args):
    if len(args) == 1 and isinstance(args[0], str):
        # case 1
    elif len(args) == 2 and isinstance(args[1], int):
        # case 2 
    elif len(args) == 2 and isinstance(args[1], str):
        # case 3
Run Code Online (Sandbox Code Playgroud)

  • 这是执行此操作的正确方法,除非您应在故障安全案例中引发异常.像else这样的东西:引发TypeError('参数1应该是一个字符串,参数2应该是一个字符串,int或完全省略')`.并且,正如@delnan所说,使用`basestring`而不是`str`,除非你有充分的理由不想要unicode. (2认同)

Mar*_*ald 27

使用 Python 3.5 或更高版本,您可以@typing.overload为重载函数/方法提供类型注释。

来自文档

@overload
def process(response: None) -> None:
    ...
@overload
def process(response: int) -> tuple[int, str]:
    ...
@overload
def process(response: bytes) -> str:
    ...
def process(response):
    <actual implementation>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!此外,还需要“从键入导入重载”。 (3认同)

小智 22

你不能.没有重载或多方法或类似的东西.一个名字指的是一件事.至于语言无论如何,你总是可以自己模仿它们......你可以检查类型isinstance(但请正确地做 - 例如在Python 2中,basestring用来检测字符串和unicode),但它很难看,一般不鼓励并且很少有用.如果方法做了不同的事情,请给它们不同的名称.考虑多态性.


Ste*_*eMc 5

简短的答案:您不能(请参见前面的讨论)。通常,您会使用类似的方法(可以添加更多类型检查和重新排序):

def my_method(self,parameter_A, parameter_B=None):
  if isinstance(parameter_B, int):
    print parameter_A * parameter_B
  else:
    print parameter_A
    if parameter_B is not None:
      print parameter_B
Run Code Online (Sandbox Code Playgroud)