What is the purpose of checking self.__class__ ? - python
检查
1 2 3 4 | class abstract1 (object): def __init__(self): if self.__class__ == abstract1: raise NotImplementedError("Interfaces can't be instantiated") |
这样做的目的是什么?是否检查类是否是其自身的类型?
代码来自nltk的http://nltk.googlecode.com/svn/trunk/doc/api/nltk.probability pysrc.html probdisti
对于
1 2 3 4 5 | >>> abstract1() Traceback (most recent call last): File"<stdin>", line 1, in <module> File"<stdin>", line 4, in __init__ NotImplementedError: Interfaces can't be instantiated |
对于
1 2 3 4 5 6 7 | >>> class Foo(abstract1): pass ... >>> f = Foo() >>> f.__class__ <class '__main__.Foo'> >>> f.__class__ is Foo True |
在这里抛出异常就像在代码的其他地方使用
注意,测试实例类型的方法是使用
1 2 3 4 | class abstract1(object): def __init__(self): if type(self) is abstract1: raise NotImplementedError("Interfaces can't be instantiated") |
应优先选择
对于自定义类,在这里使用相等测试没有什么意义,
python还包括一个定义抽象基类的标准库,称为
What is the purpose of that? Is it to check whether the class is a type of itself?
是的,如果您试图构造一个
我想说有些人会这样做:
1 2 3 4 | class Foo(AbstractBase): def __init__(self): super(Foo, self).__init__() # ... |
即使基是抽象的,也不希望基的
您在那里发布的代码没有操作;
您可以尝试创建一个抽象基类,该类检查
线索在类的名称"abstract1"和错误中。这是一个抽象类,意思是一个打算被子类化的类。每个子类将提供自己的行为。抽象类本身用于记录接口,即实现接口的类应该具有的方法和参数。它并不打算被实例化,测试用来判断我们是在类本身中还是在子类中。
参见Julien Danjou在本文中关于抽象类的部分。