我接到一个老师的作业,他想用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()