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
对于一个实例 子类 的
abstract1,
self.__class__是将特定的子类的引用:
>>> class Foo(abstract1): pass... >>> f = Foo()>>> f.__class__<class '__main__.Foo'>>>> f.__class__ is FooTrue
在这里抛出异常就像
assert在代码的其他地方使用语句一样,它可以防止您犯傻的错误。
请注意,测试实例类型的 pythonic
方法是改用
type()函数,以及对运算符的
身份 测试
is:
class abstract1(object): def __init__(self): if type(self) is abstract1: raise NotImplementedError("Interfaces can't be instantiated")
type()应该优先考虑,
self.__class__因为后者可能被class属性遮盖。
对于自定义类,在这里使用相等性测试没有什么意义,
__eq__无论如何,基本上将其实现为身份测试。
Python还包括一个用于定义抽象基类的标准库,称为
abc。它使您可以将方法和属性标记为抽象,并拒绝创建尚未重新定义这些名称的任何子类的实例。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)