python中有没有一种方法可以将内部类的对象与外部类的对象集成在一起?

时间:2020-08-04 17:51:45

标签: python class inner-classes

我是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'   

3 个答案:

答案 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()
相关问题