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,我从未打算实例化一个类,他们立即知道.
这还是不好的形式吗?
查看抽象基类,因为如果这是您真正想要做的事情,它们将提供对子类如何实例化的更细粒度的控制.
总而言之,这可能是一个有效的用途,因为你并没有阻止我将任何我想要的东西传递给你的代码,但我仍然不会认为它是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(因为它们应该允许多重继承),那么它将创建你引发的异常.
所以现在,你不只是告诉我,我无法实例化你的类,你告诉我,当你从类中继承时,我不能使用多重继承.
根本不检查,我们都是成年人.只需添加一个O不应直接实例化的注释,作为注释和/或文档.
它就像有人会调用一个需要使用intas作为参数的方法一样string.如果程序崩溃,他们搞砸了.否则,您需要将类型检查添加到几乎所有内容中.