全局名称self未在继承的类中定义

时间:2018-01-22 21:33:48

标签: python class oop attributes self

我在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。

2 个答案:

答案 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'。要么将其更改为自己,要么将自己重命名为计算器。

More info

Other that may help you