【问题标题】:Unexpected output in class inheritance code类继承代码中的意外输出
【发布时间】:2021-12-01 17:23:10
【问题描述】:

我尝试了这个继承代码并且得到了一个意外的输出。请指导我哪里错了。

Child.py

from ParentClass import Parent


class ChildImp(Parent):
    var2 = 200

    def __init__(self):
        Parent.__init__(self, 8, 3)


    def getData(self):
        self.var1 + self.Sub() + self.Add()


obj = ChildImp()
print(obj.getData())

父类.py

class Parent:
    var1 = 100

    def __init__(self, a, b):
        self.firstNUm = a
        self.secondNUm = b


    def Add(self):
        return self.firstNUm + self.secondNUm

    def Sub(self):
       return self.firstNUm - self.secondNUm


obj1 = Parent(4, 6)
print(obj1.Add())
obj2 = Parent(9, 2)
print(obj2.Sub())

输出:

10
7
None

Process finished with exit code 0

这 10 和 7 是从哪里来的? 为什么输出中有一个 None ?

【问题讨论】:

  • 因为ParentClass.py 没有将其代码包装在if __name__ == '__main__': 语句中,所以该文件的代码将在导入时执行。
  • getData() 返回无。你有 print(obj.getData()) 所以它打印 None。

标签: python class inheritance


【解决方案1】:

输出来自以下每个调用

10     # print(obj1.Add())
7      # print(obj2.Sub())
None   # print(obj.getData())

请注意,AddSubreturn 计算值,btu getData 没有 return 因此将隐含 return None 因此最后一个输出。

请注意,AddSub 行执行的原因是 import 语句。如果您只希望那些在直接调用该脚本时运行,您可以将该块修改为

if __name__ == '__main__':
    obj1 = Parent(4, 6)
    print(obj1.Add())
    obj2 = Parent(9, 2)
    print(obj2.Sub())

【讨论】:

  • 另外,如果我是你,我会首先解释为什么 print(obj1.Add())print(obj2.Sub()) 会被执行。
【解决方案2】:

输出来自 3 个打印语句。

print(obj1.Add())    # prints 10
print(obj2.Sub())    # prints 7
print(obj.getData()) # prints None

需要返回 ChildImp getData() 函数,否则返回 None。

from ParentClass import Parent

class ChildImp(Parent):
    var2 = 200

    def __init__(self):
        Parent.__init__(self, 8, 3)

    def getData(self):
        return self.var1 + self.Sub() + self.Add() # <== added return

obj = ChildImp()
print(obj.getData())

在父类中添加if name == __main__ check 也是一种很好的做法,因此只执行被调用类中的 main。

# ParentClass.py
class Parent:
    ...

if __name__ == '__main__':

    obj1 = Parent(4, 6)
    print(obj1.Add())
    obj2 = Parent(9, 2)
    print(obj2.Sub())

【讨论】:

  • 记住self.var1实际上应该是Parent.var1
【解决方案3】:

10 和 7 是 AddSub 方法的返回值

None 存在是因为 getData 不返回任何内容

对于所有三个值,都有一个print 调用。

【讨论】:

  • 由于在每个不在函数内部的文件中都有对print的调用,所以在导入或运行python文件时执行
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多