【问题标题】:self deleting instance自删除实例
【发布时间】:2012-10-26 22:21:06
【问题描述】:

是否可以在某些情况下为某些实例进行类调用del()?还是把self变成None?

    class T:
        def __init__(self, arg1, arg2):
            condition=check_condition(arg1,arg2)
            if not condition:
               do_something(arg1)
            else:
               del(self) #or self=None or return None

我需要做这样的事情来确保永远不会存在某种实例。

【问题讨论】:

  • ...raise Exception() ?
  • This question 有一堆可以提供帮助的答案
  • 好主意伊兹卡塔。我的问题是:类 T 是一个包含自己的验证方法的值对象。在无效的情况下,对象不应该被初始化(如果可能的话,应该销毁)。

标签: python


【解决方案1】:

类构造函数旨在真正构造其类的实例,并且不会通过不构造实例并返回 None 来半静默地失败。没有人会想到这种行为。

宁可使用工厂函数。

class Test(object):
    @classmethod
    def create(cls):
        if ok(): return cls()
        else: return None

【讨论】:

  • 我同意返回 None 绝不是一个好主意——尤其是因为 __init__() 无论如何都没有返回值。 ;-)
【解决方案2】:

我需要做这样的事情来确保永远不会存在某种实例。

如果您只是想阻止创建此类实例,请在满足条件时在__init__() 中引发异常。

这是用于通知构造函数失败的标准协议。更多讨论请见Python: is it bad form to raise exceptions within __init__?

【讨论】:

    【解决方案3】:

    是的,您可以调用 del self。它工作得很好,但你应该知道它所做的只是删除对实例的引用,在 init 方法中名为“self”。

    在python中,只要在某处有对它们的引用,对象就存在。

    如果您希望对象在某些条件下永远不存在,那么永远不要尝试在这些条件下创建实例,在您创建对象的 init 之外。

    此外,您可以在此类中定义一个有用的函数来返回是否满足这些条件。

    【讨论】:

      【解决方案4】:

      您可以按照 cmets 中的建议引发异常。你可以实现__new__。你也可以制作一些工厂类,比如

      class TFactory:
          def createT(self, arg1, arg2):
              condition=check_condition(arg1,arg2)
              if not condition:
                 return do_something(arg1)
              else:
                 return None     
      

      【讨论】:

        【解决方案5】:

        查看__new__。您应该能够检测到您关心的情况并返回None。正如@lzkata 在 cmets 中提到的那样,提出Exception 可能是更好的方法。

        【讨论】:

        • 这样做。最好不要一开始就创建实例,而不是在__init__ 中清理它。
        猜你喜欢
        • 2015-08-07
        • 1970-01-01
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 2012-07-26
        • 2023-04-04
        • 2012-04-20
        相关资源
        最近更新 更多