есть ли способ в python интегрировать объекты внутреннего класса с объектами внешнего класса? - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в объектно-ориентированном программировании в python. Я попытался попробовать небольшой фрагмент кода, чтобы понять, как работают классы, особенно вложенные классы. См. Фрагмент кода ниже. Мне нужно назначить несколько аргументов для параметров в классе Laptop. после этого метод show в классе Student должен вызывать атрибуты из экземпляра Laptop, а затем выдавать сообщение в соответствии с методом show(). Например, если я создаю lap1 = Laptop("HP","i5","8GB"), тогда метод show должен отображать «Gowtham has HP Laptop». Я не могу понять, что происходит не так.

class Student:
    def __init__(self,name,rollno):
        self.name = name
        self.rollno = rollno
        self.lap = self.Laptop()
        
    def __str__(self):
        return f"{self.name} has roll number {self.rollno}"
    
    def show(self):
            print(self.name + " has " + self.lap.brand + " laptop")
    
    class Laptop:
        def __init__(self,brand,cpu,ram):
            self.brand = brand
            self.cpu = cpu
            self.ram = ram
            
        def display(self):
            print(self.brand,self.cpu,self.ram)
        
s1 = Student("Gowtham",55)
print(s1)
lap1 = Laptop("HP","i5","8GB")
s1.show()

После попытки выполнения этого кода я получаю сообщение об ошибке, которое отображается как TypeError:

__init__() missing 3 required positional arguments: 'brand', 'cpu', and 'ram'   

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Итак, я думаю, вы не понимаете, в чем смысл вложенного класса и как он соотносится с его родительским классом. class мгновенно создает / получает доступ к вложенному классу.

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

class Containers:
    class Box:
        pass

    class Cup:
        pass

    class Bowl:
        pass

Обратите внимание, что хотя они имеют схожесть, они ни в чем не полагаются на каждый. Они просто вложены, чтобы помочь с организацией. Но, вероятно, было бы лучше просто разложить эти классы и поместить их в файл с именем containers.py

Итак, вернемся к вашей ситуации. Лучше бы класс распаковать. Создайте экземпляр объекта Laptop. Затем, чтобы исправить ошибку, создайте экземпляр объекта Student и передайте вновь созданный объект Laptop. Вот так.

laptop = Laptop(brand, cpu, ram)
student = Student(name, rollno, laptop)

Затем внутри Student __init__ измените его с self.laptop = self.Laptop() на self.laptop = laptop

Теперь он должен работать для вас.

0 голосов
/ 04 августа 2020

Нет реальной причины, чтобы Laptop был атрибутом Student или Student знать, как создать экземпляр Laptop.

class Student:
    def __init__(self, name, rollno, laptop):
        self.name = name
        self.rollno = rollno
        self.lap = laptop
        
    def __str__(self):
        return f"{self.name} has roll number {self.rollno}"
    
    def show(self):
        print(self.name + " has " + self.lap.brand + " laptop")
    

class Laptop:
    def __init__(self, brand, cpu, ram):
        self.brand = brand
        self.cpu = cpu
        self.ram = ram
            
    def display(self):
        print(self.brand, self.cpu, self.ram)
        

s1 = Student("Gowtham", 55, Laptop("HP", "i5", "8GB"))
print(s1)
s1.show()
0 голосов
/ 04 августа 2020

Сообщение об ошибке ясное, даже если вы не смогли включить все сообщение. Посмотрите на последнюю строку в Student.__init__:

self.lap = self.Laptop()

Для создания экземпляра Laptop требуется три аргумента; вы не предоставили ничего.

Вы не указали, как вы ожидаете, что это будет работать. Если вы хотите, чтобы «пустышка» была назначена новому учащемуся, вам нужно изменить Laptop.__init__, чтобы сделать манекен. Если вы настаиваете на том, что портативный компьютер уже существует, когда вы создаете экземпляр ученика, вам необходимо передать существующий объект портативного компьютера - или, возможно, передать аргументы портативного компьютера.

...