Как определить метод, который возвращает атрибуты из другого класса

#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.