python 中有没有办法将内部 class 的对象与外部 class 的对象整合?
is there a way in python to integrate objects of inner class with objects of outer class?
我是 python 中面向对象编程的新手。我试图尝试一小段代码来理解 classes 是如何工作的,尤其是嵌套的 classes。请看下面的一段代码。我需要为 Laptop class 中的参数分配一些参数。之后,Students class 中的 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'
错误消息很清楚,即使您没有包含完整的消息。查看 Student.__init__
中的最后一行:
self.lap = self.Laptop()
Laptop 实例化需要三个参数;您提供了 none.
您还没有指定您希望它如何工作。
如果您想将“虚拟”笔记本电脑分配给新学生,则需要更改 Laptop.__init__
以制作虚拟机。如果您坚持在实例化学生时笔记本电脑已经存在,那么您需要传入现有的笔记本电脑对象——或者可能传入笔记本电脑的参数。
所以我认为您对嵌套 class 的意义及其与父级 class 的关系感到困惑。
只是因为您将 class 定义嵌套在另一个定义中并不意味着父 class 立即 creates/has 访问嵌套的 class.
嵌套 classes 实际上只是用来帮助组织相似的 classes。甚至比在一个模块中只包含单独的未嵌套 classes 更可能更好。例如,您可能会争辩说这是嵌套 class 的一个很好的理由,因为它们很相似。
class Containers:
class Box:
pass
class Cup:
pass
class Bowl:
pass
请注意,尽管它们有相似之处,但它们并不依赖于每个人。它们只是嵌套以帮助组织。但最好只是取消那些 classes 并将它们放在一个名为 containers.py
的文件中
所以回到你的情况。最好取消 class 的嵌套。实例化一个 Laptop
对象。然后修复你的错误,实例化一个 Student
对象并传入你创建的新创建的 Laptop
对象。就这样吧。
laptop = Laptop(brand, cpu, ram)
student = Student(name, rollno, laptop)
然后在 Student
__init__
中将其从 self.laptop = self.Laptop()
更改为 self.laptop = laptop
它现在应该适合你了。
没有真正的理由让 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()
我是 python 中面向对象编程的新手。我试图尝试一小段代码来理解 classes 是如何工作的,尤其是嵌套的 classes。请看下面的一段代码。我需要为 Laptop class 中的参数分配一些参数。之后,Students class 中的 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'
错误消息很清楚,即使您没有包含完整的消息。查看 Student.__init__
中的最后一行:
self.lap = self.Laptop()
Laptop 实例化需要三个参数;您提供了 none.
您还没有指定您希望它如何工作。
如果您想将“虚拟”笔记本电脑分配给新学生,则需要更改 Laptop.__init__
以制作虚拟机。如果您坚持在实例化学生时笔记本电脑已经存在,那么您需要传入现有的笔记本电脑对象——或者可能传入笔记本电脑的参数。
所以我认为您对嵌套 class 的意义及其与父级 class 的关系感到困惑。
只是因为您将 class 定义嵌套在另一个定义中并不意味着父 class 立即 creates/has 访问嵌套的 class.
嵌套 classes 实际上只是用来帮助组织相似的 classes。甚至比在一个模块中只包含单独的未嵌套 classes 更可能更好。例如,您可能会争辩说这是嵌套 class 的一个很好的理由,因为它们很相似。
class Containers:
class Box:
pass
class Cup:
pass
class Bowl:
pass
请注意,尽管它们有相似之处,但它们并不依赖于每个人。它们只是嵌套以帮助组织。但最好只是取消那些 classes 并将它们放在一个名为 containers.py
所以回到你的情况。最好取消 class 的嵌套。实例化一个 Laptop
对象。然后修复你的错误,实例化一个 Student
对象并传入你创建的新创建的 Laptop
对象。就这样吧。
laptop = Laptop(brand, cpu, ram)
student = Student(name, rollno, laptop)
然后在 Student
__init__
中将其从 self.laptop = self.Laptop()
更改为 self.laptop = laptop
它现在应该适合你了。
没有真正的理由让 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()