你好,我有一个关于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)
这是我的小代码。我对此很陌生。我不明白出了什么问题。非常感谢。
您仅分配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)
以下是导致错误的事件顺序:
您创建类的一个新实例。此时,Python 对以下内容一无所知self.data:
lazy = Lazy()
Run Code Online (Sandbox Code Playgroud)你称之为传递None:
lazy(None)
Run Code Online (Sandbox Code Playgroud)现在,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)