#python #class
#python #класс
Вопрос:
Кто-нибудь может помочь мне исправить эту ошибку? спасибо (я пытаюсь получить доступ к переменной в материнском классе в дочернем классе)
class Animal:
def __init__(self, name):
self.name = name
class Mammal:
def Presentation(self):
print(self.name "is a mammal")
dog = Animal("Dog")
dog.Mammal.Presentation()
Обратная трассировка (последний последний вызов):
Файл «», строка 11, в
Ошибка типа: в Presentation() отсутствует 1 требуемый позиционный аргумент: ‘self1’
Комментарии:
1. Что вы подразумеваете под «материнским» и «дочерним» классами? Вы объявили вложенный класс, но у вас нет ни экземпляра, ни какой-либо прямой ссылки на вложенный класс, который вы могли бы использовать
2. Как вы думаете, почему
Mammal
объекты будут иметьself.name
атрибут? он нигде не назначен? Что, по вашему мнению, делает вложение определения класса в другое определение класса? Это не создает отношения наследования. На самом деле, он вообще не делает ничего полезного, за исключением, возможно, разделения пространств имен3. «Я пытаюсь получить доступ к переменной в материнском классе в дочернем классе», но у вас нет ссылки ни на один экземпляр класса Animal , и опять же, здесь нет отношения мать / дочь. Ваша ошибка возникает из-за того, что вы пытаетесь вызвать метод для объекта класса, а не для экземпляра, но тогда его нет
self
, отсюда и ошибка.4. Млекопитающее не является атрибутом животного; это своего рода животное.
Ответ №1:
Это не настоящий ответ на ваш вопрос, но я предполагаю, что вы хотите сделать что-то подобное:
class Animal:
def __init__(self, name):
self.name = name
def Presentation(self):
raise NotImplementedError
class Mammal(Animal):
def Presentation(self):
print(self.name "is a mammal")
dog = Mammal("Dog")
dog.Presentation()
Комментарии:
1. Вам не нужно определять
Mammal.__init__
, поскольку он просто вызывает тот же метод, которыйMammal.__init__
разрешил бы выражение, если бы оно не было определено.2. да, это правда, мой первый неотредактированный ответ не содержал функции init . Но я хотел показать, как его вызывают, в случае изменения параметра «name»
3. Переопределение @ExceptionFinder
__init__
здесь не показывает ничего полезного. Весь смысл наследования заключается в повторном использовании кода.4. @ExceptionFinder Тогда, по крайней мере, измените имя параметра или сделайте что-нибудь, что гарантирует переопределение метода. Как сейчас, это просто шум.
5. @chepner Отлично, я его удалил 🙂 Хотя это не мое личное предпочтение.
Ответ №2:
Для этого дочерний класс должен был бы наследовать родительский атрибут self .
class Animal:
def __init__(self, name):
self.name = name
class Mammal:
def Presentation(inherit):
print(inherit.name “is a mammal”)
dog = Animal("Dog")
Animal.Mammal.Presentation(dog)
Комментарии:
1. ну, это решение, но это не наследование, здесь нет родительского / дочернего класса. Это просто предоставление аргумента методу. И неправильное использование классов
2. @AbrarAhmed правильно, это должно было бы быть
Animal.Mammal.Presentation(dog)
, чтобы не выдавать ошибку, независимо от того, это все равно было бы неправильным способом сделать это3. Мне было бы искренне интересно узнать, как правильно это сделать для проекта, над которым я работаю.
4. @JacobLee правильный способ сделать что ? Использование наследования? По сути, нет необходимости во вложенных классах. Это не делает ничего полезного. Вы наследуете от другого класса, используя что-то подобное
class Child(Parent): ...
в определении класса.5. Хорошо, так что это просто непрактично.