我是python面向对象编程的新手。我试图尝试一小段代码来理解类的工作方式,尤其是嵌套类。请参阅下面的代码。我需要为Laptop类中的参数分配一些参数。之后,Students类中的show方法必须调用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'
答案 0 :(得分:0)
即使您没有包含整个消息,该错误消息也很清楚。查看Student.__init__
的最后一行:
self.lap = self.Laptop()
Laptop实例需要三个参数。您什么都没提供。
您尚未指定期望的工作方式。
如果要将“虚拟”笔记本电脑分配给新学生,则需要更改Laptop.__init__
来制作虚拟对象。如果您在实例化学生时坚持认为笔记本电脑已经存在,那么您需要传递现有的笔记本电脑对象-或传递笔记本电脑的参数。
答案 1 :(得分:0)
所以我认为您对嵌套类的意义以及它与父类的关系感到困惑。
仅仅因为您将一个类定义嵌套在另一个类中并不意味着父类会立即创建/具有对嵌套类的访问权限。
嵌套类实际上仅用于帮助组织相似的类。甚至比在一个模块中只有单独的未嵌套类更好。例如,您可能会争辩说这是嵌套类的一个很好的原因,因为它们是相似的。
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
现在应该可以为您工作了。
答案 2 :(得分:0)
没有真正的理由让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()