自我检查的目的是什么python

自我检查的目的是什么python,python,class,oop,interface,self,Python,Class,Oop,Interface,Self,检查自我的目的是什么?我找到了一些创建抽象接口类的代码,然后检查它的自身 class abstract1 (object): def __init__(self): if self.__class__ == abstract1: raise NotImplementedError("Interfaces can't be instantiated") 这样做的目的是什么? 是否要检查该类是否属于自身类型? 代码来自NLTK的您在那里发布的代码没有操作self.\uuu

检查自我的目的是什么?我找到了一些创建抽象接口类的代码,然后检查它的
自身

class abstract1 (object):
  def __init__(self):
    if self.__class__ == abstract1: 
      raise NotImplementedError("Interfaces can't be instantiated")
这样做的目的是什么? 是否要检查该类是否属于自身类型?


代码来自NLTK的

您在那里发布的代码没有操作
self.\uuuu类\uuuuu==c1
不是条件的一部分,因此会计算布尔值,但不会对结果进行任何处理


您可以尝试创建一个抽象基类来检查self.\uuuu class\uuuuu
是否等于抽象类而不是假设的子类(通过if语句),以防止由于开发人员的错误而实例化抽象基类本身。

线索在类的名称中,“abstract1”,在错误中。这是一个抽象类,意思是一个子类。每个子类将提供自己的行为。抽象类本身用于记录接口,即实现接口的类预期具有的方法和参数。它并不意味着要自己实例化,测试用来判断我们是在类本身还是在子类中

请参阅Julien Danjou在本文中关于抽象类的部分

这样做的目的是什么?是否要检查类本身是否是一种类型


是的,如果您尝试构造类型为
Abstract1
的对象,它将抛出异常,告诉您不允许这样做。

self.\uuuu class\uuu
是对当前实例类型的引用

对于
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
在这里抛出异常就像在代码的其他地方使用
assert
语句一样,它可以防止您犯愚蠢的错误

请注意,测试实例类型的python方法是使用,而不是与带有
is
运算符的标识测试一起使用:

class abstract1(object):
    def __init__(self):
        if type(self) is abstract1: 
            raise NotImplementedError("Interfaces can't be instantiated")
type()
应该优先于
self.\uuuu class\uuuu
,因为后者

这里使用相等测试没有什么意义,因为对于自定义类,
\uuuuuueq\uuuuu
基本上是作为身份测试实现的


Python还包括一个用于定义抽象基类的标准库,称为。它允许您将方法和属性标记为抽象,并将拒绝创建尚未重新定义这些名称的任何子类的实例。

在Python3中,使用
type()
检查类型或
\uuuu class\uuuu
将返回相同的结果

class C:pass
ci=C()
print(type(ci)) #<class '__main__.C'>
print(ci.__class__) #<class '__main__.C'>
C级:合格
ci=C()
打印(类型(ci))#
打印(ci.\uuuuu类\uuuuuuu)#

我最近检查了
@dataclass
装饰器(Raymond Hettinger直接参与了该项目),他们使用
\uuuuu class\uuuuuuuuuuuuuuu
来引用该类型


因此,使用
\uuu class\uuu
:)

我认为这需要更多的上下文。你在哪里找到这个代码的?它基本上坏了。@iGuanaut:为什么坏了?当按预期使用时,它工作良好;作为一个抽象的基类。我很确定之前它是不同的?我不知道——我同意,现在的内容没有被破坏。尽管对于Python的较新版本,应该只使用一个抽象基类,使用
abc.ABCMeta
。abc仍然可以直接实例化。
class C:pass
ci=C()
print(type(ci)) #<class '__main__.C'>
print(ci.__class__) #<class '__main__.C'>