当前位置: 首页 > 面试题库 >

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

谢铭
2023-03-14
问题内容

检查的目的是self.__class__什么?我找到了一些代码,这些代码创建了一个抽象接口类,然后检查它self.__class__是否本身,例如

class abstract1 (object):
  def __init__(self):
    if self.__class__ == abstract1: 
      raise NotImplementedError("Interfaces can't be instantiated")

目的是什么? 是否要检查类是否本身是类型?

该代码来自NLTK的http://nltk.googlecode.com/svn/trunk/doc/api/nltk.probability-
pysrc.html#ProbDistI


问题答案:

self.__class__是对当前实例 类型 的引用。

对于的实例abstract1abstract1该类 本身 就是类,而对于抽象类,这是您不想要的。抽象类仅应被子类化,而不是直接创建实例:

>>> abstract1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __init__
NotImplementedError: Interfaces can't be instantiated

对于一个实例 子类abstract1self.__class__是将特定的子类的引用:

>>> class Foo(abstract1): pass
... 
>>> f = Foo()
>>> f.__class__
<class '__main__.Foo'>
>>> f.__class__ is Foo
True

在这里抛出异常就像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。它使您可以将方法和属性标记为抽象,并拒绝创建尚未重新定义这些名称的任何子类的实例。



 类似资料:
  • 问题内容: Python中self这个词的目的是什么?我知道它是指从该类创建的特定对象,但是我看不到为什么需要将它作为参数显式添加到每个函数中。为了说明这一点,在中,我可以这样做: 我很容易理解。但是在Python中,我需要包括: 问题答案: 让我们看一个简单的向量类: 我们希望有一种计算长度的方法。如果我们想在类中定义它,它将是什么样? 当我们将其定义为全局方法/函数时,它应该是什么样? 因此,

  • 问题内容: 我在python中有一个问题。 文档说这是一个类实例所属的类。因此,我进行了一系列实验: 一切顺利。 然后我输入如下代码: 从上面的代码中,我认为也许等于或,但是以下代码使我感到惊讶: 为什么更改了,但仍然保持在3?而且,当我改变时,变得。世界到底是什么? 问题答案: “从以上代码中,我认为NewCounter1.count等于NewCounter1。class.count” 问题是,

  • 我需要在我的中添加一个新的目录位置,但问题是我使用的是一个全新安装的系统(Linux),其中尚未定义任何。我读过并使用过,我认为我很了解它,但我不知道当没有存在时会发生什么。 我不能附加到不存在的东西上,但我希望当前发现的所有重要库都能正常工作,因此要小心,我在Python中使用了来获取所有标准值。然后我为定义了一个-变量,包括我刚刚找到的所有节点,以及我的新目录。但是哇,很多东西都停止工作了!P

  • 问题内容: 我正在学习Python编程语言,遇到了一些我不太了解的东西。 用类似的方法: 怎么self办?这是什么意思?它是强制性的吗? 该方法有什么作用?为什么有必要?(等等。) 我认为它们可能是OOP构造,但我不太了解。 问题答案: 你是对的,这些是oop结构。 是一个类的构造函数。该self参数引用对象的实例(如thisC ++)。 分配对象的内存时将调用该方法: self如果要将值与对象持

  • 问题内容: 我从未见过这样的代码: 一样吗? 编辑 如果该类是继承的,它指向哪个类? 问题答案: 指向其编写所在的类。 因此,如果您的getInstance方法位于类名中,则以下行: 将做与: 编辑:评论后,还有更多信息。 如果您有两个相互扩展的类,则有两种情况: 在子类中定义 在父类中定义 第一种情况看起来像这样(在此示例中,我已经删除了所有不必要的代码-您必须将其重新添加来获得单例行为)*:

  • 本文向大家介绍什么是拼写检查?相关面试题,主要包含被问及什么是拼写检查?时的应答技巧和注意事项,需要的朋友参考一下 浏览器中输入区欧盟,输入错误,会被拼写检查为去欧盟,实际上原理是采用了贝叶斯原理,由贝叶斯公式可知P(c|w),w表示拼写错误的情况,而c表示实际想要拼写的单词,等于P(w|c)P(c)/P(w),也就是在若干备选中选择最大的P(c|w),而P(w)都是相同的,即找到使得P(w|c)

  • 我几天前听说了Docker的事,想过去看看。 但事实上,我不知道这个“容器”的用途是什么? 什么是容器? 它能取代一个专门用于开发的虚拟机吗? 简单地说,在公司中使用Docker的目的是什么?主要的优势?

  • 问题内容: 如果可能,如何举例说明如何实现JNDI的用法? 问题答案: JNDI是Java命名和目录接口。它用于分离应用程序 开发人员 和应用程序 部署 人员 的关注点。在编写依赖于数据库的应用程序时,无需担心用于连接该数据库的用户名或密码。JNDI允许开发人员为数据库命名,并依靠部署者将该名称映射到数据库的实际实例。 例如,如果您要编写在Java EE容器中运行的代码,则可以编写此代码来获取JN