python2.5的抽象类

2024-06-12 04:38:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前重构了一个定义客户机或服务器的类。班上有很多

if client:
    XXXXXXXXXXXX
elif server:
    YYYYYYYYYYYY

所以我决定用相似的代码创建一个类a,为客户机创建一个C类,为继承a的服务器创建一个S类(当然,它们没有这些名称^ ^)

所以A类是一种抽象类。但问题是Python2.5没有抽象类,它是2.6版本附带的。所以我想知道是否有一种方法可以禁止类a的实例化

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

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


Tags: 代码版本服务器名称client客户机if定义
3条回答

这种方法的优点是,您不需要对子类做任何操作来使其成为非抽象的。在

class ABC(object):
    abstract = True
    def __new__(cls, *args, **kwargs):
        if "abstract" in cls.__dict__ and cls.__dict__["abstract"] == True:
            raise RuntimeError(cls.__name__ + " is abstract!")
        return object.__new__(cls)

class Subclass(ABC):
    pass

print Subclass()
print ABC()

输出:

^{pr2}$

如果要创建抽象子类,只需执行以下操作:

class AbstractSubclass(ABC):
    abstract = True

可以在构造函数的开头调用方法“foo”。在中,此方法引发异常。在C和S中,您重新定义了“foo”,这样就不再有异常了。在

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

Python不是一种静态类型语言,调用代码根本不需要知道它调用的对象的类型。因此,您可以通过记录接口需求并直接在两个不相关的类中实现接口来“定义”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\u-thing方法传入任何对象。在

相关问题 更多 >