我接到一个老师的作业,他想用python教oop。我对C++和C语言中的OOP非常熟悉,但是在我的一些AA>中很难弄清楚到底发生了什么。它可以工作,两个类都能按我的要求工作,但我必须添加一些奇怪的代码才能工作,我不明白为什么。
具体引用从第64行开始的代码

class Cone(Cylinder):

    #Constructor
    def __init__ (self, radius, height):
        Cylinder.__init__(self, radius, height)
        self.calcVolume()


    def calcVolume(self):
        Cylinder.calcVolume(self)
        self.__volume = Cylinder.GetVolume(self) * (1.0/3.0)

因此,当实现Cone时,我不明白为什么当圆锥体的构造函数调用圆柱体的构造函数时不调用Cylinder.calcVolume()。如果代码是隐式调用的,但我不得不显式调用该方法,那么对我来说,它将更有意义。一些指导或解释会很棒。
发完帖子我做了这个改动,这更有意义吗?
class Cone(Cylinder):

    #Constructor
    def __init__ (self, radius, height):
        Cylinder.__init__(self, radius, height)
        self.calcVolume()


    def calcVolume(self):
        self.__volume = self.GetBase().GetArea() * self.GetHeight() * (1.0/3.0)

最佳答案

这就是当你打电话给Cone.__init__()时发生的事情:
它执行Cylinder.__init__()
依次调用self.calcVolume()
由于继承,解析顺序在Cone类型上找到方法,
它调用Cone.calcVolume()而不是Cylinder.calcVolume()
__init__()期间,我想您想打电话给:
Cone.calcVolume(self)
Cone.__init__()中的Cylinder.calcVolume(self)
当然,如果您使用的是新样式类(继承自Cylinder.__init__()),那么您可以只使用object;但是在旧样式类上type(self).calcVolume(self)将给您type(self)类型,而不是实际的类,这在您的情况下是行不通的。
完整示例:

class Circle():
    #Constructor
    def __init__ (self, radius):
        self.__radius = radius
        self.calcArea()
    def calcArea(self, PI = 3.14):
        self.__area = (self.__radius**2) * PI
    #Get Functions
    def GetArea(self):
        return self.__area
    def GetRadius(self):
        return self.__radius
    #Set Functions
    def SetRadius(self, radius):
        self.__radius = radius
        self.calcArea()

class Cylinder():
    #Constructor
    def __init__(self, radius, height):
        self.__height = height
        self.__base = Circle(radius)
        Cylinder.calcVolume(self)
    def calcVolume(self):
        self.__volume = self.__base.GetArea() * self.__height
    #Get Functions
    def GetVolume(self):
        return self.__volume
    def GetBase(self):
        return self.__base
    def GetRadius(self):
        return self.__base.GetRadius()
    def GetHeight(self):
        return self.__height
    #Set Functions
    def SetRadius(self, radius):
        self.__base.SetRadius(radius)
        self.calcVolume()
    def SetHeight(self, height):
        self.__height = height
        self.calcVolume()


class Cone(Cylinder):
    #Constructor
    def __init__ (self, radius, height):
        Cylinder.__init__(self, radius, height)
        Cone.calcVolume(self)
    def calcVolume(self):
        Cylinder.calcVolume(self)
        self.__volume = Cylinder.GetVolume(self) * (1.0/3.0)
    #Get Functions
    def GetVolume(self):
        return self.__volume
    #Set Functions
    def SetRadius(self, radius):
        Cylinder.SetRadius(self, radius)
        self.calcVolume()
    def SetHeight(self, height):
        Cylinder.SetHeight(self, height)
        self.calcVolume()


def main():
        cylinder = Cylinder(5, 6)
        cone = Cone(5, 6)
        circle = Circle(5)
        print cylinder.GetVolume()
        print cone.GetVolume()
        print circle.GetArea()
        cone.SetHeight(7)
        print cone.GetVolume()

main()

10-07 21:38