python 中“self.data”的用法

jdy*_*dyg 3 python attributes

你好,我有一个关于Python中属性使用的问题。我了解到,在函数定义中,我们可以为对象分配一些新属性,例如:self!但是,当尝试使用它时,我收到一个错误:“...实例没有属性‘数据’

class Lazy:
    def __call__(self, num):
            if num is None:
                    return self.data
            # It changes the current object in-place,
            # by reassigning the self attribute.
            else:
                    self.data += num
Run Code Online (Sandbox Code Playgroud)

这是我的小代码。我对此很陌生。我不明白出了什么问题。非常感谢。

Ada*_*dam 5

您仅分配self.dataif num is None,因此您可能会在分配之前尝试访问它。为了防止这种情况,您可以在构造函数中初始化它:

class Lazy:
    def __init__(self):
        self.data = 0

    def __call__(self, num):
        if num is None:
            return self.data
        else:
            self.data += num
Run Code Online (Sandbox Code Playgroud)

以下是导致错误的事件顺序:

  1. 您创建类的一个新实例。此时,Python 对以下内容一无所知self.data

    lazy = Lazy()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你称之为传递None

    lazy(None)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在,Python 输入__call__and 因为 if 条件计算结果为True它尝试返回self.data。等一下...它仍然不知道是什么self.data...所以它吐出了一个错误。

为了防止这种情况,您始终必须在尝试对属性的值执行某些操作(例如,从函数返回它们)之前分配属性。它不必位于构造函数中:就在 Python 第一次尝试访问该属性之前。对于任何变量都是如此,即以下情况是不可能的:

print(a) # How do you expect Python to know the value of a?
a = 5    # too late to assign it now...
Run Code Online (Sandbox Code Playgroud)