Python:子类AttributeError

时间:2017-03-07 13:14:17

标签: python subclass parent attributeerror

Python 3.5.2 在尝试访问父字段时,我的子类有一些有趣的问题。有三个类。(Command-> Newarticle-> Editarticle)。代码大致是这样的,我删除了其他方法,以最小化代码量):

class Command(object):
    __metaclass__=abc.ABCMeta ;
    def __init__(self):
        # set default command name
        self.__name="I hate planes" ;
        self.__has_ended=False ;        

class Newarticle(Command):
    def __init__(self, modules):
        # parent init
        Command.__init__(self) ;
        self.__output=modules[MAIN_OUTPUT] ;
        self.__input=modules[MAIN_INPUT] ;

class Editarticle(Newarticle):
    def __init__(self, modules):
        Newarticle.__init__(self, modules) ;
        #super().__init__(modules) ;

        print(dir(self)) ;

        # ERROR HAPPENS HERE !
        self.__output.use_random_function() ;

我确信模块中有MAIN_OUTPUT,因为Newarticle完美运行。 错误文本:AttributeError:'Editarticle'对象没有属性'_Editarticle__output'

'dir'的打印输出是:['_Command__has_ended','_Command__name','_ _ editarticle__acc_data','_ _Eitarticle__art_id','_ Nearticle__art_images','_ Newarticle__art_name','_ Newarticle__art_text','_ Neuarticle__db_mod','_ Newarticle__input',' _Newarticle__output ','_ Newarticle__run_subcmds','_ Newarticle__tag_reader',...]等等。

所以问题很清楚,Python在方法之前添加了Class名称,并且甚至没有尝试在父级中查找。那么我该如何解决呢?我觉得因为没有看到问题在哪里而失明。

P.S。我试图调用'super()'而不是'Newarticle。 init (self,modules)',结果完全相同。 P.S.P.S.我试图从第一个父级('Command')删除元类ABC,同样的错误。

1 个答案:

答案 0 :(得分:2)

问题是您使用的是双下划线前缀,它会调用名称重整。不要这样做。这些很少有用。

只需为您的属性使用普通名称;

def __init__(self):
    # set default command name
    self.name = "I hate planes"
    self.has_ended = False 

(另外,请删除那些分号。它们不在Python中使用。)