python - Python 2.5 的抽象类

标签 python refactoring

我目前正在重构一个定义客户端或服务器的类。类(class)有很多

if client:
    XXXXXXXXXXXX
elif server:
    YYYYYYYYYYYY

所以我决定用类似的代码创建一个类 A,一个类 C 用于客户端,另一个类 S 用于继承 A 的服务器。(他们当然没有这些名称 ^^)

所以类 A 是某种抽象类。但问题是 Python 2.5 中没有抽象类,它是 2.6 版本自带的。所以我想知道是否有一种方法可以禁止 A 类的实例化。

一个解决方案是在类 A 的构造函数中引发 NotImplemented 错误,但 C 和 S 具有相同的代码,所以我将其放在“抽象”类 A 中(坏主意?)。

这可能看起来很愚蠢,但我只是偶尔用 Python 进行开发,而且我是一名年轻的程序员。 你有什么建议?

最佳答案

在静态类型语言中,您使用抽象基类 (ABC),因为您需要一些具有已定义大小、接口(interface)等的对象来传递。否则,无法编译试图调用该对象方法的代码。

Python 不是静态类型语言,调用代码根本不需要知道它调用的对象的类型。因此,您可以通过记录接口(interface)需求并直接在两个不相关的类中直接实现该接口(interface)来“定义”您的 ABC。

例如,

class Server:
    def do_thing(self):
        pass #do that server thing here

class Client:
    def do_thing(self):
        pass #do that client thing here

def do_thing(thingy):
    thingy.do_thing() # is it a Client? a Server? something else?

s=Server()
c=Client()

do_thing(s)
do_thing(c)

在这里,您可以通过参数与调用相匹配的 do_thing 方法传入任何对象。

关于python - Python 2.5 的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6548228/

相关文章:

python - 我们从 prs.slides[4].shapes[3].width 得到的数字的单位是什么,其中 prs 是 python-pptx 中的演示对象?

python - 如何在 Jupyter Notebook 单元格中刷新 Python 导入?

node.js - 在 Node js 中正确使用 async wait

python - 仅在选定区域中查找 2d-Numpy 数组中最大值的索引

python - Telethon 获取没有管理员权限的 channel 参与者

python - 将 .docx 文件中的变量替换为用户输入的变量

c# - 失控的 switch 语句的最佳替代方法是什么?

refactoring - 过早重构?

javascript - 编写一个简单的自定义阅读更多关于需要重构的 jquery 的点击功能

c# - 如何通过 using 语句使用对象初始值设定项?