我可以在python循环中调用super吗?

时间:2018-06-04 10:34:54

标签: python super

如何使以下代码正常工作,如果不可能,有什么更好的方法可以做到这一点? 我似乎无法弄明白,因为我相信我不应该创造一个父母的对象。只写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类的允许键的字符串列表。

2 个答案:

答案 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)