Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:我的代码中发生了意想不到的事情。。。。?_Python_Oop_Logic_Control Flow - Fatal编程技术网

Python:我的代码中发生了意想不到的事情。。。。?

Python:我的代码中发生了意想不到的事情。。。。?,python,oop,logic,control-flow,Python,Oop,Logic,Control Flow,我在自学oop的概念。所以我在我的学生班里有一台班内笔记本电脑。My student class保存学生信息,laptop class保存其笔记本电脑配置。我通过一个student对象(name、rollno、brand、cpu、ram)传递所有必需的参数。我有一个方法可以显示所有传递的信息。但是发生了意想不到的事情 class Student: def __init__(self, name, rollno, brand, cpu, ram): self.name =

我在自学oop的概念。所以我在我的学生班里有一台班内笔记本电脑。My student class保存学生信息,laptop class保存其笔记本电脑配置。我通过一个student对象(name、rollno、brand、cpu、ram)传递所有必需的参数。我有一个方法可以显示所有传递的信息。但是发生了意想不到的事情

class Student:
    def __init__(self, name, rollno, brand, cpu, ram):
        self.name = name
        self.rollno = rollno
        self.lap = self.Laptop(brand, cpu, ram)

    def show(self):
        print(self.name, self.rollno, self.lap.show())

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

        def show(self):
            print(self.brand, self.cpu, self.ram)

 s1 = Student('Mayank', '1654302036', 'H.P', 'i3', '4gb')
 s1.show()
我的输出是

H.P i3 4gb
Mayank 1654302036 None
我不知道为什么要先显示我笔记本电脑的详细信息。

self.lap.show()
Student.show
中调用
print
之前进行评估(并调用
print
本身)

通常,您不会在代码中使用
打印
“deep”;返回一个
str
,由其他人决定是否打印它

class Student:
    def __init__(self, name, rollno, brand, cpu, ram):
        self.name = name
        self.rollno = rollno
        self.lap = self.Laptop(brand, cpu, ram)

    def show(self):
        return "%s %s %s" % (self.name, self.rollno, self.lap.show())

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

        def show(self):
            return "%s %s %s" % (self.brand, self.cpu, self.ram)


s1 = Student('Mayank', '1654302036', 'H.P', 'i3', '4gb')
print(s1.show())
但是,如果您确实有充分的理由让
show
立即调用print,请不要将
self.lap.show()
作为参数传递给print。打印 首先查看学生信息,然后调用
lap.show()


这里的问题是,show方法使用的是
print()
函数,而不是返回字符串。发生的情况如下:

  • 调用
    s1.show()
    时,解释器希望在
    Student.show()方法中构建一个字符串
    
  • 为此,它将计算提供给
    print()
    函数的所有参数。这包括调用
    Laptop.show()
    方法。但由于此方法不是返回字符串而是直接打印,因此此内部调用将首先写入终端
  • 最后,初始调用的输出准备发送到ouptut
纠正此行为的最佳方法是覆盖每个类的
\uuuu str\uuu
方法。这个方法在Python中打印任何对象时都会被隐藏起来,它必须返回一个string对象,而不是像这里这样打印它。以下是您可能会做的:

class Student:
    def __init__(self, name, rollno, brand, cpu, ram):
        self.name = name
        self.rollno = rollno
        self.lap = self.Laptop(brand, cpu, ram)

    def __str__(self):
        return self.name + ' ' + self.rollno + ' ' + self.lap.__str__()

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

        def __str__(self):
            return self.brand + ' ' + self.cpu + ' ' + self.ram
然后调用
s1.\uu str\uuuu()

等价地,
print(s1)
将输出预期结果。

因为
self.lap.show()
打印其输出,它不会返回它。您应该返回消息,而不是直接在方法中打印它们。还有,为什么要创建一个内部类呢?非常感谢您,先生,您清除了我所有的障碍。))
class Student:
    def __init__(self, name, rollno, brand, cpu, ram):
        self.name = name
        self.rollno = rollno
        self.lap = self.Laptop(brand, cpu, ram)

    def __str__(self):
        return self.name + ' ' + self.rollno + ' ' + self.lap.__str__()

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

        def __str__(self):
            return self.brand + ' ' + self.cpu + ' ' + self.ram