python - 如何在继承自抽象基类的类中定义方法
问题描述
我有两个具有两种方法的抽象类:getArea(width, height)
和getPerimeter(width, height)
. 这些方法也是抽象的,因此它们可以(或不)在派生类中实现(在我的情况下,它们必须实现)。在 C# 中,我可以编写IRectangle.getArea(){}
或IParallelogram.getPerimeter(){}
简单地进行实现。我怎样才能在 Python 中做到这一点?我认为我必须使用类似的东西,super(IRectangle, self).getArea()
但我不知道如何。
from abc import ABC, abstractmethod
class IRectangle(ABC):
@abstractmethod
def getArea(width, height):
pass
@abstractmethod
def getPerimeter(width, height):
pass
class IParallelogram(ABC):
@abstractmethod
def getArea(parHeight, parBase):
pass
@abstractmethod
def getPerimeter(parHeight, parBase):
pass
class Calculate (IParallelogram, IRectangle):
解决方案
您的类层次结构是颠倒的。首先,您将定义一个更通用的类,例如Shape
作为层次结构的(抽象)根。
class Shape(ABC):
@abstractmethod
def getArea(self):
pass
@abstractmethod
def getPerimeter(self):
pass
然后,具体的类IRectangle
将IParallelogram
适当getArea
地实施getPerimeter
。
class IRectangle(Shape):
def getArea(self):
...
def getPerimeter(self):
...
class IParallelogram:
def getArea(self):
...
def getPerimeter(self):
...
推荐阅读
- c# - 对象引用未设置为实例 c#
- firebase - 读取 firebase kotlin 后设置 UI 元素
- python - 如何使用 __getitem__ 方法?
- javascript - 在 three.js 中使用 camera.lookat() 时停止对象的倾斜
- python - 如何将 python-cgi 与 dynamodb 连接?
- azure - Azure ARM - Microsoft.Resources/deploymentScripts
- java - JavaFX Webview:addEventListener 用于点击不在超链接上?
- swift - 想要将 Slidervalue 设置为 UserDefault:线程 1:致命错误:在隐式展开可选值时意外发现 nil
- wildfly - 带有主机名的 Wildfly 服务器
- jersey - 默认为 Swagger UI 中的所有 API 调用添加参数