自我检查的目的是什么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'>