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

在Python中检查成员是否存在

茹正祥
2023-03-14
问题内容

我经常要检查一个对象是否有成员。一个示例是在函数中创建单例。为此,可以这样使用hasattr

class Foo(object):
    @classmethod
    def singleton(self):
        if not hasattr(self, 'instance'):
            self.instance = Foo()
        return self.instance

但您也可以这样做:

class Foo(object):
    @classmethod
    def singleton(self):
        try:
            return self.instance
        except AttributeError:
            self.instance = Foo()
            return self.instance

一种方法比另一种更好吗?

编辑: 添加了@classmethod…但是,请注意,问题 在于如何制作单例,而在于如何检查对象中成员的存在。

编辑: 对于该示例,一种典型用法是:

s = Foo.singleton()

然后s是类型Foo相同的对象,每次相同。并且,通常,该方法被调用多次。


问题答案:

这是两种不同的方法:№1是LBYL(飞跃前先看一下),而№2是EAFP(要求宽恕多于许可)。

Pythonistas通常建议EAFP更好,其格式为“在您测试文件的时间与尝试自己创建文件的时间之间,如果进程创建文件,该怎么办?”的说法。这个论点在这里并不适用,但这是一般的想法。异常不应被视为
特殊。

在您的情况下,从性能角度来说,由于try在CPython中设置异常管理器(关键字)非常便宜,而创建异常(raise关键字和内部异常创建)则相对昂贵,因此使用方法№2只会引发一次异常;
之后,您只需使用该属性。



 类似资料:
  • 是否可以编写一个模板,根据是否在类上定义了某个成员函数来改变行为? 下面是我想写的一个简单的例子: 因此,如果定义了,那么它将使用它;否则就不会。我不知道怎么做的神奇部分是“function_exists”部分。

  • 问题内容: 我想检查某个网站是否存在,这就是我正在做的事情: 如果该页面不存在(错误402或其他任何错误),我可以在该行中做什么以确保正在读取的页面退出? 问题答案: 您可以使用HEAD请求而不是GET。它将仅下载标题,而不下载内容。然后,您可以从标题中检查响应状态。 或者你可以使用 或者你可以使用

  • 问题内容: 我有一个问题-我正在使用Selenium(firefox)Web驱动程序打开网页,单击一些链接等,然后捕获屏幕截图。 我的脚本可以从CLI正常运行,但是通过cronjob运行时,它并没有通过第一个find_element()测试。我需要添加一些调试,或一些帮助我弄清为什么失败的东西。 基本上,我必须先单击“登录”锚点,然后才能进入登录页面。元素的构造为: 我正在通过LINK_TEXT方

  • 问题内容: 我正在尝试通过查找元素 在Python中,selenium并不总是存在。是否有一条快速的线检查它是否存在,并在不存在时显示NULL或FALSE代替错误消息? 问题答案: 您可以按以下方式实现/ 阻止以检查元素是否存在: 或使用其中一种方法进行检查。它应该返回空列表或与传递的选择器匹配的元素列表,但如果没有找到元素,也不例外:

  • 问题内容: 我想编写一个确定子列表是否存在于较大列表中的函数。 有Python函数可以做到这一点吗? 问题答案: 如果您确定输入内容仅包含数字0和1,那么可以转换为字符串: 这样会创建两个字符串,因此它不是最有效的解决方案,但是由于它利用了Python中优化的字符串搜索算法,因此对于大多数用途而言可能已经足够好了。 如果效率非常重要,则可以查看适用于列表的Boyer- Moore 字符串搜索算法。

  • 所以我想检查我的列表中是否有一个词存在于消息中,所以我做了这样的操作: 但现在我还想检查我的列表中是否有一个词不存在,但如果我这样做了,它就不会工作。只是无视黑名单 为什么会这样?