#python #oop #inheritance #methods #attributes
#python #ооп #наследование #методы #атрибуты
Вопрос:
В моей программе у меня следующий вопрос. Как я могу определить метод в классе «Мышь», «Клавиатура» и «Экран», чтобы они возвращали номер и компьютер, к которому они принадлежат связанный атрибут класса (поэтому для класса keyboard это будет: «Компьютер {} находится в комнате {}и имеет язык {} ‘) Может кто-нибудь сказать мне, как я могу определить такой метод для этих 3 классов без изменения самой программы? Метод должен быть определен для каждого отдельного класса. Точная задача состоит в том, чтобы «Расширить вывод maus, screen и tastatur, чтобы пользователь знал, к какому компьютеру в какой комнате они принадлежат».
Я попытался определить следующий метод:
def as_text(self):
return "{} an {} in {}".format(self.__name, self.__computer, self.__computer.__room)
В моих трех классах я встроил ссылку на компьютер. У моего класса Computer есть ссылка на room, поэтому я попытался вызвать его с self.__computer.__room
помощью, но это не работает, и я не уверен, как вызвать этот атрибут.
Вот мой код:
class Room:
__name = "unknown"
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
class Device:
__name = "Device"
def __init__(self, name):
self.__name = name
def as_text(self):
return "%s" % (self.__name)
class Computer(Device):
__ip = "unknown"
def __init__(self, name, ip, room):
super().__init__(name)
self.__ip = ip
self.__room = room
def as_text(self):
return "%s with ip=%s" % (super().as_text(), self.__ip)
class Laptop(Computer):
def __init__(self, name, room, ip, with_case = True):
super().__init__(name, room, ip)
self.__with_case = with_case
def as_text(self):
if (self.__with_case):
return "%s with case" % super().as_text()
else:
return super().as_text()
class Screen(Device):
__width = "1920"
__height = "1080"
def __init__(self, name, width, height, computer):
super().__init__(name)
self.__width = width
self.__height = height
self.__computer = computer
def as_text(self):
return "{} an {}".format(self.__name, self.__computer)
class Tastatur(Device):
__language = 'English'
def __init__(self, name, language, computer):
super().__init__(name)
self.__language = language
self.__computer = computer
class Maus(Device):
__type = 'Gaming Mouse'
def __init__(self, name, type, computer):
super().__init__(name)
self.__type = type
self.__computer = computer
Комментарии:
1. прекратите использовать искажение имен с двойным подчеркиванием, подобное этому. Кроме того, прекратите создавать переменную класса только для того, чтобы немедленно затенить ее переменной экземпляра в
__init__
2. Это требование моего учителя, оно должно оставаться таким
3. Имейте в виду, вы изучаете «Java в Python». В любом случае, что вы пробовали? Неясно, что вы подразумеваете под требованием «Может кто-нибудь сказать мне, как я могу определить такой метод для этих 3 классов без изменения самой программы? » Что вы имеете в виду, не изменяя саму программу? Определение метода — это изменение самой программы . Но в любом случае ваши требования / ограничения мне совершенно понятны.
4. @juanpa.arrivillaga Мне жаль, но это программа, которую дал мне мой учитель. Я просто должен внести несколько изменений, подобных тому, что я упомянул выше. Вы знаете, как я мог бы это сделать
5. Опять же, вы вообще что-нибудь пробовали ? Извините, но это не обучающий сервис для вашего класса. Мы не просто собираемся делать за вас домашнее задание. Что именно вызывает у вас проблемы?
Ответ №1:
Ваш запрос не совсем понятен, вот что я получил. Это мой метод для класса Screen:
def as_text(self):
return "{} an {} in {}".format(super().as_text(), self.__computer.as_text(), self.__computer.display_room())
super().as_text()
Это вызывает метод as_text
из родительского класса Device .
self.__computer.as_text()
Это вызывает as_text()
метод из экземпляра класса Computer, который является атрибутом вашего класса Screen .
self.__computer.display_room()
Это вызывает метод display_room()
из класса Computer, я его создал и возвращает имя комнаты.
def display_room(self):
return self.__room.get_name()
Теперь вы должны быть в состоянии самостоятельно писать методы для Tastur и Maus.