繁体   English   中英

python中的“self.data”用法

[英]“self.data” usage in python

您好我对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

这是我的小代码。 我对此非常陌生。 我无法弄清楚出了什么问题。 非常感谢你。

如果num is None ,则只分配self.data ,因此在分配之前尝试访问它可能会发生。 要防止这种情况,您可以在构造函数中初始化它:

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

    def __call__(self, num):
        if num is None:
            return self.data
        else:
            self.data += num

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

  1. 您创建了一个新类的实例。 在这一点上,Python对self.data一无所知:

     lazy = Lazy() 
  2. 你叫它传递None

     lazy(None) 
  3. 现在,Python输入__call__ ,因为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...

您正在尝试引用self.data但未初始化/声明它。

class Lazy:
    def __init__(self, data=0):
        self.data = data #You are initializing data to 0 or a user specified value

    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

要修改self.data ,必须首先使用类的特殊__init__方法初始化self.data属性。

从官方文档:

object .__ init __(self [,...])

在创建实例时调用。 参数是传递给类构造函数表达式的参数。

所以你可以将self.data设置为0,那么你的__call__方法应该按照写入的方式工作。

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

    def __call__(self, num):
        if num is None:
            return self.data
        else:
            self.data += num

您可以在__init__()方法或其他任何地方初始化该属性(尽管__init__()是推荐的位置)。

尝试self.data并初始化它(如果它不存在)。

class Lazy:
    def __call__(self, num):
            try:
                self.data
            except:
                self.data = 0
            if num is None:
                    return self.data
            # It changes the current object in-place,
            # by reassigning the self attribute.
            else:
                    self.data += num

我希望它有所帮助。

我想在你的代码中指出:

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

def __call__(self, num):
    if num is None:
        return self.data

假如你调用你的实例如: lazy(some_value)那么你的else分支将执行哪个求值为:

    else:
        self.data += num # self.data = self.data + num

但是,在这种情况下可能存在self.data可能未定义的情况,也会出现上述错误。

我同意上述所有答案,但我也需要关注这个问题。

请享用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM