alv*_*vas 16 python oop interface class self
检查的目的是self.__class__什么?我找到了一些创建抽象接口类的代码,然后检查它self.__class__本身是否是自己的,例如
class abstract1 (object):
def __init__(self):
if self.__class__ == abstract1:
raise NotImplementedError("Interfaces can't be instantiated")
Run Code Online (Sandbox Code Playgroud)
那是什么意思?是要检查这个类是否是一种类型?
代码来自NLTK的http://nltk.googlecode.com/svn/trunk/doc/api/nltk.probability-pysrc.html#ProbDistI
Mar*_*ers 26
self.__class__是对当前实例类型的引用.
对于实例abstract1,那会是abstract1类本身,这是你不想与一个抽象类的东西.抽象类仅用于子类,而不是直接创建实例:
>>> abstract1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __init__
NotImplementedError: Interfaces can't be instantiated
Run Code Online (Sandbox Code Playgroud)
对于一个实例子类的abstract1,self.__class__是将特定的子类的引用:
>>> class Foo(abstract1): pass
...
>>> f = Foo()
>>> f.__class__
<class '__main__.Foo'>
>>> f.__class__ is Foo
True
Run Code Online (Sandbox Code Playgroud)
在这里抛出异常就像assert在代码中的其他地方使用语句一样,它可以防止您犯下愚蠢的错误.
请注意,测试实例类型的pythonic方法是使用该type()函数,以及与运算符的标识测试is:
class abstract1(object):
def __init__(self):
if type(self) is abstract1:
raise NotImplementedError("Interfaces can't be instantiated")
Run Code Online (Sandbox Code Playgroud)
type()应该是首选,self.__class__因为后者可以被类属性遮蔽.
对于自定义类,在这里使用相等测试没有什么意义,__eq__无论如何基本上都是作为身份测试实现的.
Python还包括一个标准库来定义抽象基类,称为abc.它允许您将方法和属性标记为抽象,并拒绝创建尚未重新定义这些名称的任何子类的实例.