Почему я получаю сообщение об ошибке из-за неправильного количества аргументов?

У меня есть:

import datetime
class Animal(object):

    def __init__(self, dob, carnivore):
        self.__dob = dob
        self.__carnivore = carnivore

    @property
    def dob(self):
        return self.__dob

    @dob.setter
    def dob(self, dob):
        self.__dob = dob

    @property
    def carnivore(self):
        return self.__carnivore

    @carnivore.setter
    def carnivore(self, carnivore):
        self.__carnivore = carnivore

    def __str__(self):
        return "DOB: " + str(self.__dob) + "\nCarnivore: " + str(self.__carnivore)

Мой второй класс:

import Species.Animal as Animal
import datetime as date


class Amphibian(Animal):

    def __init__(self, dob=date.datetime.now(), carnivore=False, *characteristics):
        super(Animal, self).__init__(dob, carnivore)
        self.__characteristics = []
        for characteristic in characteristics:
            self.__characteristics.append(characteristic)

    @property
    def characteristics(self):
        return self.__characteristics

    @characteristics.setter
    def characteristics(self, characteristic):
        self.__characteristics.append(characteristic)

    def __str__(self):
        characteristics = ""
        for characteristic in self.__characteristics:
            characteristics += str(characteristic)
        return characteristics

С использованием:

amphibian = Amphibian(date.date(1979, 1, 12), True, "BackBone", "Cold Blooded")
print(amphibian)

Я получаю сообщение об ошибке:

Traceback (последний вызов последним): файл "C: /Users/Daniel/PycharmProjects/ObjectOrientedSpecies/Species/Amphibian.py", строка 7, в классе Amphibian (Animal): TypeError: module .__ init __ () принимает не более 2 аргументов (3 дано)

Я новичок в Python, поэтому не уверен, что такое хорошие методы объектно-ориентированного программирования.


person Daniel Devlin    schedule 09.09.2015    source источник


Ответы (1)


Я вижу две проблемы. Во-первых, вы должны вызвать super для имени класса, в котором вы вызываете super (это немного сложно), так что эта строка должна быть super(Amphibian, self).__init__(dob, carnivore), а не super(Animal, self).__init__(dob, carnivore). Python сам найдет базовый класс Animal.

Однако основная проблема заключается в том, что класс Animal (почти наверняка) находится в файле с именем «Animal.py». Python автоматически создает модуль с именем Animal, когда видит файл с именем «Animal.py» (и делает что-то подобное для всех других имен «.py». Таким образом, ваш класс Animal фактически находится внутри модуля с именем Animal.

Следовательно, когда вы делаете import Species.Animal as Animal, вы импортируете модуль, а не класс внутри него. Итак, когда вы делаете class Amphibian(Animal):, ваши амфибии наследуются от класса module, а не от класса Animal. Чтобы вместо этого получить класс Animal, вам нужно изменить свой импорт на следующий: from Species.Animal import Animal.

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

person or1426    schedule 09.09.2015