Перегрузка конструктора в python с аргументами по умолчанию - PullRequest
0 голосов
/ 16 февраля 2019

Я определил класс в 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 голосов
/ 16 февраля 2019

Python не имеет нескольких конструкторов - см. Несколько конструкторов в Python?

0 голосов
/ 16 февраля 2019

Как написали другие, 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

Обратите внимание, что присваивать значения по умолчанию в объявлении метода следует очень неохотно, поскольку он может работать иначе , чем кто-то думает, пришедший из другого языка.Правильный способ определения значений по умолчанию будет использовать None и присваивать значения по умолчанию, как это

class MyClass:
    def __init__(self, edate=None, fdate=None):
        if edate:
           fdate = "" if fdate is None else fdate
        ... 
0 голосов
/ 16 февраля 2019

В отличие от Java или C # , вы не можете определить несколько конструкторов.Тем не менее, вы можете определить значение по умолчанию , если оно не передано.

...