带有默认参数的python中的构造方法重载

时间:2019-02-16 11:21:33

标签: python class constructor-overloading

我在python中定义了一个类,如下所示。

class myclass:
    def __init__(self,edate,fdate=""):
        print("Constructors with default arguments...")

    def __init__(self):
        print("Default Constructor")

我为此课程创建了一个对象

obj = myclass()

工作正常。我希望以下对象创建能够正常工作,

obj1 = myclass("01-Feb-2019")

但是它抛出一个错误,说

Traceback (most recent call last):
  File "class.py", line 9, in <module>
    obj = myclass("01-Feb-2019")
TypeError: __init__() takes 1 positional argument but 2 were given

但是,如果我按如下所示更改类的定义,

class myclass:
    def __init__(self):
        print("Default Constructor")
    def __init__(self,edate,fdate=""):
        print("Constructors with default arguments...")

现在obj1 = myclass("01-Feb-2019")有效。但是obj = myclass()会引发以下错误,

Traceback (most recent call last):
  File "class.py", line 10, in <module>
    obj = myclass()
TypeError: __init__() missing 1 required positional argument: 'edate'

我们可以在Python中定义一个构造函数重载吗?我可以定义一个既可以接受空参数又可以接受一个参数的构造函数吗?

3 个答案:

答案 0 :(得分:1)

正如其他人所写的那样,Python不支持多个构造函数*)。但是,您可以轻松地模拟它们,如下所示:

class MyClass:
    def __init__(self, edate=None, fdate=""):
        if edate:
            print("Constructors with default arguments...")
        else:
            print("Default Constructor")

那你就可以做

obj1 = MyClass("01-Feb-2019")
=> Constructors with default arguments...
obj2 = MyClass()
=> Default Constructor

*),除非您愿意使用multi-dispatch-使用Python强大的检查功能

请注意,应该非常不情愿地在方法声明中分配默认值,因为它可能work differently比别人认为来自另一种语言的要多。定义默认值的正确方法是使用 None并分配这样的默认值

class MyClass:
    def __init__(self, edate=None, fdate=None):
        if edate:
           fdate = "" if fdate is None else fdate
        ... 

答案 1 :(得分:0)

Java或C#不同,您不能定义多个构造函数。但是,如果未传递默认值,则可以定义默认值

答案 2 :(得分:0)

Python没有多个构造函数-请参见Multiple constructors in python?