我在python中定义了一个抽象基类:
class calculator:
__metaclass__ = ABCMeta
@abstractmethod
def __init__(self, fileName):
path = './cartesians/'
onlyFiles = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
for elem in list(onlyFiles):
test = elem.split('.')[0]
if test != fileName.split('.')[0]:
onlyFiles.remove(elem)
self.onlyFiles = onlyFiles
self.onlyFiles.sort()
@abstractmethod
def optimize(self):
pass
mopac类继承自计算器类:
from calculator import *
class mopac(calculator):
def __init__(self, fileName):
self.test = "test"
super(mopac, self).__init__(fileName)
def optimize(calculator):
print self.test
for file in self.onlyFiles:
do stuff
在main.py中,我有:
from mopac import *
calc = mopac(inFile)
calc.optimize()
当我运行代码时,它告诉我:
File "main.py", line 50, in main
calc.optimize()
File "path/mopac.py", line 24, in optimize
print self.test
NameError: global name 'self' is not defined
我不明白为什么在这里将自我视为变量/属性。有人可以帮忙吗?如果我删除"打印self.test",那么它会给我同样的错误" self未定义" with self.onlyFiles。
答案 0 :(得分:1)
在Python中,您应指定self
作为定义的第一个形式参数。在您的代码中,calculator
是您的第一个形式参数,因此当它作为对象/实例方法调用时,它将获取实例的值,并且没有可访问的正式参数self
(领先报告的语法错误):
def optimize(self):
print self.test
for file in self.onlyFiles:
do stuff
答案 1 :(得分:0)
def optimize(calculator):
print calculator.test
for file in calculator.onlyFiles:
do stuff
每个类方法的第一个参数,包括init,始终是对类的当前实例的引用。按照惯例,此参数始终命名为self。在init方法中,self引用新创建的对象;在其他类方法中,它指的是调用其方法的实例。
在这种情况下,您将'self'变量重命名为'calculator'。要么将其更改为自己,要么将自己重命名为计算器。