Python多态性

我有一位老师的作业,试图用python教OOP.我对C和C#中的OOP非常熟悉,但是很难弄清楚code中的某些情况.它可以正常工作,并且两个类都可以按我的意愿工作,但是我必须添加一些奇怪的代码才能使它工作,我不明白为什么.

具体引用从第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 .__ init __()中的Cone.calcVolume(self),或
> Cylinder .__ init __()中的Cylinder.calcVolume(self).

当然,如果您正在使用新的样式类(从对象继承),则可以只使用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()
上一篇:春季-子文档中的SD MongoDB多态


下一篇:P4