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

Can I call super in a loop in python?

我怎样才能让下面的代码工作,如果不可能,有什么更好的方法来做这件事? 我似乎无法弄清楚,因为我相信我不应该创建父级的对象。只写 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)

我正在尝试将值推送到父级 class,但在它们出现在允许的列表中之前不知道属性名称。

我知道 Geometry 目前不支持成员测试,因为没有定义任何内容。

Geometry superclass 具有lat、lng、name 等属性。 Allowed 助手 class 将 return 一个字符串列表,表示地址 class.

允许的键

我确定您使用 super 的方式不对。

你应该先初始化超级class:

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)

就这样,超级class自己整理好了

你的Addressclass可以把自己的属性整理出来。 (在 Allowed 的帮助下)。

我假设 d 参数是一个字典,就像 kwargs 一样。

你使用 super 的方式对我来说意味着你应该刚刚使用 self。 (除了 k in Geometry 没有任何意义)

首先,如果您想使用 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)