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