我有一个有很多参数的超类。我想创建一个共享所有这些参数的子类,并添加额外的一个或两个参数。为了省略双重编码,我使用了Avoid specifying all arguments in a subclass中指定的方法:
class Container(Item):
def __init__(self,**kwargs):
try: self.is_locked=kwargs.pop('is_locked')
except KeyError: pass
super(Container, self).__init__(**kwargs)
def open(self):
print "aw ys"
然而,当我尝试调用Container类的对象时:
> some_container.open()
AttributeError: 'Item' object has no attribute 'open'
似乎some_container不是Container(),而是添加了一个变量is_locked的Item()。我做错了什么?
编辑:我的项目定义:
class Item(object:
def __init__(self,istemplate,id,short,long,type,flags,value,damagerange,damagereductionrange,weight):
if istemplate==False:
self.__class__.instances.append(self)
self.istemplate=istemplate
(... many variables like that...)
self.id=id
self.randomizestuff()
if istemplate==True:
self.__class__.templates.append(copy.deepcopy(self))
答案 0 :(得分:0)
好的,经过一些研究后发现我实际上并没有引用some_container.open()中的容器,而是一个由同一模板创建项目实例的函数创建的动态项目。该函数将新实例定义为Item(...)
而不是Container(...)
,因为它是在引入任何子类之前创建的。
some_container=Container(...)
some_container.open()
上述内容从一开始就有效,因此payhima无法复制我的错误。