首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中"self.data“的用法

问python中"self.data“的用法
EN

Stack Overflow用户
提问于 2013-04-07 22:59:12
回答 5查看 9.6K关注 0票数 3

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

代码语言:javascript
复制
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

这是我的小代码。我在这方面是个新手。我不知道哪里出了问题。非常感谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-07 23:03:54

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

代码语言:javascript
复制
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()

  • 你可以称之为传递None:

lazy(None)

  • Now,Python进入__call__,因为if条件的计算结果为True,所以它尝试返回self.data。等等..。它仍然不知道self.data是什么.因此它会显示一个错误。

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

代码语言:javascript
复制
print(a) # How do you expect Python to know the value of a?
a = 5    # too late to assign it now...
票数 4
EN

Stack Overflow用户

发布于 2013-04-07 23:05:26

您正在尝试引用self.data,但未对其进行初始化/声明。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-04-07 23:07:11

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

来自官方文档:

object.__init__(self,...)

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

因此,您可以将self.data设置为0,然后您的__call__方法应该可以按编写的方式工作。

代码语言:javascript
复制
class Lazy:
    def __init__(self):
        self.data = 0

    def __call__(self, num):
        if num is None:
            return self.data
        else:
            self.data += num
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15863784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档