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,同样的错误。
答案 0 :(得分:2)
问题是您使用的是双下划线前缀,它会调用名称重整。不要这样做。这些很少有用。
只需为您的属性使用普通名称;
def __init__(self):
# set default command name
self.name = "I hate planes"
self.has_ended = False
(另外,请删除那些分号。它们不在Python中使用。)