检查自我.__ class__的目的是什么? - 蟒蛇

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.它允许您将方法和属性标记为抽象,并拒绝创建尚未重新定义这些名称的任何子类的实例.