如何使以下代码正常工作,如果不可能,有什么更好的方法可以做到这一点? 我似乎无法弄明白,因为我相信我不应该创造一个父母的对象。只写super()似乎不适合我(3.6.5)。
class Geometry(object):
def __init__(self, **kwargs):
if kwargs:
allowed = ['lat', 'lng', ]
for k,v in kwargs.items():
if k in allowed:
setattr(self, k, v)
class Address(Geometry):
def __init__(self, d = None):
if d:
for k,v in d.items():
if k in Geometry:
setattr(super, k, v)
if k in Allowed('Address'):
setattr(self, k, v)
我试图将值推送到父类,但在它们位于允许的列表之前不知道属性名称。
我知道Geometry目前还不支持会员资格测试,因为没有定义。
Geometry
超类具有lat,lng,name等属性。
Allowed
助手类将返回表示Address类的允许键的字符串列表。
答案 0 :(得分:1)
我确定您错误地使用了super
。
您应首先初始化超类:
class Geometry(object):
def __init__(self, **kwargs):
if kwargs:
allowed = ['lat', 'lng', ]
for k,v in kwargs.items():
if k in allowed:
setattr(self, k, v)
class Address(Geometry):
def __init__(self, **d = None):
super().__init__(d)
if d:
for k,v in d.items():
if k in Allowed('Address'):
setattr(self, k, v)
通过这种方式,超级人员将自己排除在外。
您的Address
课程可以对自己的属性进行排序。 (由Allowed
帮助。)
我假设d
param是一个字典,就像kwargs
一样。
您使用super
的方式对我来说意味着您应该使用self
。 (除了k in Geometry
没有任何意义)
答案 1 :(得分:0)
首先,如果您想使用setattr
设置这些属性,则无需使用super
,而是可以使用self
。
如果您仍想使用super
,则必须将其用作方法;
setattr(super(), k, v)
此外,我认为最好的解决方案是将字典d
传递给Geometry
的构造函数,而不是在Address
构造函数中设置值,你可以这样做;
class Address(Geometry):
def __init__(self, d = {}):
Geometry.__init__(self, **d)
for k, v in d.items():
if k in Allowed('Address'):
setattr(self, k, v)