【问题标题】:Can python class reference nonexistent variable and method? [duplicate]python类可以引用不存在的变量和方法吗? [复制]
【发布时间】:2021-04-03 06:33:18
【问题描述】:
class SoftDeleteMixin(object):
    deleted_at = Column(DateTime)
    deleted = Column(types.SoftDeleteInteger, default=0)

    def soft_delete(self, session):
        """Mark this object as deleted."""
        self.deleted = self.id
        self.deleted_at = timeutils.utcnow()
        self.save(session=session)

在类 SoftDeleteMixin 方法 soft_delete 中,它引用了不存在的 self.idself.save。为什么在 python 中可以做到这一点?

注意:重点是类可以引用不存在的变量和方法,而不是Mixin类。

【问题讨论】:

  • 您是否尝试实际运行您的代码并调用soft_delete?你会得到一个AttributeError
  • 可以,如果你实例化这个类的一个对象并尝试使用那个方法,它会抛出一个AttributeError。请注意,该类似乎旨在用作 mixin,因此从它继承的任何东西都可能具有这些属性
  • @Valentino 在我的代码中,我将继承这个类 SoftDeleteMixin,以及在我的类中包含 id 属性和方法 soft_delete 的其他类。它工作正常。但是我看不懂。
  • 尝试过吗? self 只是对实例的引用,即调用该方法的实例。该实例是否有id.save?如果没有,它会抛出一个AttributeError,如果是,它不会。
  • "我认为python中的self和之前java中的this是一样的。"这是对的。 Python 中的 self 与 Java 中的 this 相同。这里的问题是 Python 中的继承与 Java 中的继承非常、非常、非常、非常不同。

标签: python


【解决方案1】:

如果你实例化一个SoftDeleteMixin 类并调用soft_delete 方法,你会得到一个AttributeError

如果正如您在评论中所说,这些属性在其他地方实例化,即使在子类中,并且您在子类实例上调用 soft_delete,它会起作用,因为该属性在该方法时存在 被称为

简单来说,python 是一种解释型语言,除了语法之外,它在执行代码时不会对整个文件进行过多检查,直到实际执行了那一行。

所以,是的,您可能认为这是一个糟糕的设计,但事实并非如此,这是一种公认​​的做法(有关更多详细信息,请参阅 this question)并且语言允许。您可以定义引用未在 __init__ 方法中定义的属性或作为类属性或其他任何内容的方法。重要的是,当方法执行时, istance 具有属性。实际定义属性的位置或时间无关紧要。

【讨论】:

    【解决方案2】:

    类名中的“mixin”这个词意味着这个类打算被一个已经声明了idsave()的类继承。如果尝试单独使用,会报错。

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 2020-10-18
      • 2022-11-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2019-07-19
      相关资源
      最近更新 更多