这是检查Python类型的一个很好的理由吗?

cor*_*ory 2 python typechecking

我知道在Python中检查类型很糟糕,你应该永远不会这样做.但我似乎无法找到这个的缺点.

class O(object):         
    def __init__(self, name):
        '''Can only be called in derived classes.'''
        if type(self) is O:
            message = "%(class)s cannot be instantiated, it must be derived."
            raise TypeError, message % { "class" : O }
        self.name = name

    def fn(self):
        '''Must be populated in derived classes.'''
        raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)

现在,如果有人试图实例化O,我从未打算实例化一个类,他们立即知道.

这还是不好的形式吗?

aar*_*ing 5

查看抽象基类,因为如果这是您真正想要做的事情,它们将提供对子类如何实例化的更细粒度的控制.

总而言之,这可能是一个有效的用途,因为你并没有阻止将任何想要的东西传递给你的代码,但我仍然不会认为它是pythonic.你告诉,无法实例化你的课程.如果我想要怎么办?

使用ABC,它看起来像:

import abc

class O(object):
    __metaclass__ = abc.ABCMeta     
    def __init__(self, name):
        self.name = name

    @abc.abstractmethod
    def fn(self):
        pass
Run Code Online (Sandbox Code Playgroud)

这具有不破坏fn方法的优点.正如你所拥有的那样raise NotImplementedError,你正在超级继承多重继承.如果一个类派生自两个类,O它们都是子类并且都调用super(因为它们应该允许多重继承),那么它将创建你引发的异常.

所以现在,你不只是告诉我,我无法实例化你的类,你告诉我,当你从类中继承时,我不能使用多重继承.


Ivo*_*zel 5

根本不检查,我们都是成年人.只需添加一个O不应直接实例化的注释,作为注释和/或文档.

它就像有人会调用一个需要使用intas作为参数的方法一样string.如果程序崩溃,他们搞砸了.否则,您需要将类型检查添加到几乎所有内容中.