如何通过将基类传递给子类的"__init__()"来实例化子类?



这可能表明设计很差,但我想知道如何做到这一点,或者我应该如何实现这一点。

我想创建一个类FalseAlias,它继承自基类Alias,但每个类的参数都不同。我想通过将Alias的实例传递给FalseAlias来填充Alias的所有成员变量,但我不确定这是否可行。

class Alias:
'''A class to contain information about strings in SQL files.'''
def __init__(self, regex_match):
self.txt = regex_match.group()
self.span = regex_match.span()

def __repr__(self):
return self.txt

class FalseAlias(Alias):
'''A class for alias strings which are false positives from RegEx matching.'''
def __init__(self, alias, reason_string):
# this is not the correct approach, 
#    it would only work if I have `regex_match` to pass through `FalseAlias`
# Alias.__init__(alias)  # can't give regex match as arg, not available
self.reason = reason_string

实际上,我想做的只是将额外的信息附加到子类FalseAlias,即reason_string,这对于基类来说是不合适的。我的面向对象编程技能很初级。提前谢谢。

将基类的实例传递给子类的构造函数没有多大意义。您似乎根本不熟悉子类化,实际上您想扩展Alias的init方法。考虑一下:
class FalseAlias(Alias):
def __init__(self, regex_match, reason_string):
super().__init__(regex_match)  # Call "Alias.__init__" and use it to set attrs
self.reason = reason_string
false_alias = FalseAlias(re.search('x', 'sox'), 'some reason')
print(vars(false_alias))  # Show all instance attrs
# -> {'txt': 'x', 'span': (2, 3), 'reason': 'some reason'}

否则,就像Barmar评论的那样,你似乎想要一个容器,而不是一个子类。

class FalseAlias:
def __init__(self, alias, reason_string):
self.alias = alias
self.reason = reason_string
alias = Alias(re.search('x', 'sox'))
false_alias = FalseAlias(alias, 'some reason')
print(vars(false_alias))
# -> {'alias': x, 'reason': 'some reason'}

BTW,Alias.__repr__没有用处,正如您在上面看到的那样。文件有建议:

如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境(。如果不可能,则应返回形式为<...some useful description...>的字符串。

例如:

def __repr__(self):
r = '<{} object: {!r}, {!r}>'.format(
type(self).__name__,
self.txt,
self.span,
)
return r

再次运行上面的示例:

{'alias': <Alias object: 'x', (2, 3)>, 'reason': 'some reason'}

最新更新