我试图通过引用__init__
方法中的对象来修改class属性,然后在另一个方法中使用它。遗憾的是,下面的代码示例没有按预期工作。。。
代码
class Translator:
#list of attributes
parser=None
def __init__(self):
parser = Parser_class() ...
#some other commands
def Translate(self):
something=self.parser.GenerateHead() ...
#more commands
COMPILE ERR
AttributeError: 'NoneType' object has no attribute 'GenerateHead'
我知道我可以把它作为参数提供给Translate
方法,我只是好奇为什么Python中的这个语句不起作用。
您的实例属性做得不对。
首先,您不需要提前声明您的属性。将parser = None
放在类的顶层会创建一个名为parser
的类变量,我认为这不是您想要的。通常在Python中,您可以通过简单的赋值随时添加新的实例属性:instance.attr = "whatever"
。
其次,当您想从方法中执行实例分配时,需要使用self
来引用该实例。如果不使用self
,则将赋值给函数中的局部变量,而不是实例或类变量。实际上,特定名称self
不是必需的,但您确实需要使用该方法的第一个参数(打破命名该self
的惯例可能不是一个好主意)。
因此,要修复您的代码,请执行以下操作:
class Translator:
# don't declare variables at class level (unless you actually want class variables)
def __init__(self):
self.parser = Parser_class() # use self to assign an instance attribute
def Translate(self):
something = self.parser.GenerateHead() # this should now work