你好,我有一个关于Python中属性用法的问题。我了解到,在函数定义中,我们可以为对象分配一些新的属性,例如: self!然而,当尝试使用时,我得到了一个错误,它是"...实例没有属性'data‘“
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这是我的小代码。我在这方面是个新手。我不知道哪里出了问题。非常感谢。
发布于 2013-04-07 23:03:54
如果为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下面是导致错误的事件顺序:
self.data一无所知:lazy =Lazy()
None:lazy(None)
__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...发布于 2013-04-07 23:05:26
您正在尝试引用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发布于 2013-04-07 23:07:11
要修改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 += numhttps://stackoverflow.com/questions/15863784
复制相似问题