gpt4 book ai didi

python - 这是在 Python 中检查类型的一个好理由吗?

转载 作者:行者123 更新时间:2023-11-28 19:51:35 25 4
gpt4 key购买 nike

我知道在 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

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

这还是不好的形式吗?

最佳答案

Abstract Base Classes因为如果这是您真正想要做的事情,它们将对子类的实例化方式提供更细粒度的控制。

总而言之,这可能是一个有效的用途,因为您没有阻止想要的任何内容传递给您的代码,但我仍然不认为它是pythonic .您是在告诉 无法实例化您的类。如果我想怎么办?

使用 ABC,它看起来像:

import abc

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

@abc.abstractmethod
def fn(self):
pass

这样做的好处是不会在 fn 方法上破坏 super。正如您在 raise NotImplementedError 中遇到的那样,您正在打破 super 的多重继承。如果一个类派生自两个子类 O 并且都调用 super(因为它们应该允许多重继承),那么它将创建您引发的异常。

所以现在,您不仅告诉我无法实例化您的类,还告诉我在从您的类进行子类化时不能使用多重继承。

关于python - 这是在 Python 中检查类型的一个好理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3733730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com