Итак, я думаю, вы не понимаете, в чем смысл вложенного класса и как он соотносится с его родительским классом. 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
Теперь он должен работать для вас.