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)
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)
小智 22
你不能.没有重载或多方法或类似的东西.一个名字指的是一件事.至于语言无论如何,你总是可以自己模仿它们......你可以检查类型isinstance
(但请正确地做 - 例如在Python 2中,basestring
用来检测字符串和unicode),但它很难看,一般不鼓励并且很少有用.如果方法做了不同的事情,请给它们不同的名称.考虑多态性.
简短的答案:您不能(请参见前面的讨论)。通常,您会使用类似的方法(可以添加更多类型检查和重新排序):
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)