gpt4 book ai didi

python - 如何继承父类的所有功能?

转载 作者:行者123 更新时间:2023-12-01 01:48:21 25 4
gpt4 key购买 nike

我试图将 ete3.Tree 的所有功能继承到名为 TreeAugmented 的新类中,但并非所有方法和属性都可用?

我应该在 __init__ 中使用 super 做些什么吗?似乎使用 super 您必须指定单个属性,如 The inheritance of attributes using __init__ 中所示.

我可以在名为 tree 的类中拥有另一个对象,其中存储 ete3.Tree 中的所有内容,但我希望能够将这些对象与ete3 包。

有没有办法从父类继承所有内容?

import ete3
newick = "(((petal_width:0.098798,petal_length:0.098798):0.334371,"
"sepal_length:0.433169):1.171322,sepal_width:1.604490);"

print(ete3.Tree(newick).children)
# [Tree node '' (0x1296bf40), Tree node 'sepal_width' (0x1296bf0f)]

class TreeAugmented(ete3.Tree):
def __init__(self, name=None, new_attribute=None):
self.name = name # This is an attribute in ete3 namespace
self.new_attribute = new_attribute

x = TreeAugmented(newick)
x.children

回溯

AttributeError                            Traceback (most recent call last)
<ipython-input-76-de3016b5fd1b> in <module>()
9
10 x = TreeAugmented(newick)
---> 11 x.children

~/anaconda/envs/python3/lib/python3.6/site-packages/ete3/coretype/tree.py in _get_children(self)
145
146 def _get_children(self):
--> 147 return self._children
148 def _set_children(self, value):
149 if type(value) == list and \

AttributeError: 'TreeAugmented' object has no attribute '_children'

最佳答案

Is there a way to just inherit everything from the parent class?

默认情况下就是这种情况。子类继承它不重写的内容。

你的 child 类(class)几乎是正确的。由于您重写了 __init__ 方法,因此您需要确保也调用父类的 __init__ 方法。

这是使用super实现的:

class TreeAugmented(ete3.Tree):
def __init__(self, newick=None, name=None, format=0, dist=None, support=None, new_attribute=None):
super().__init__(newick=newick, format=format, dist=dist, support=support, name=name)
self.new_attribute = new_attribute

不需要执行self.name = name,因为它是在super().__init__()中完成的。您所需要关心的只是您 child 类(class)的具体情况。

使用 *args/**kwargs

此外,由于您没有触及所有这些父 init 属性,因此可以使用 args/kwargs 使代码更清晰:

class TreeAugmented(ete3.Tree):
def __init__(self, newick=None, new_attribute=None, *args, **kwargs):
super().__init__(newick=newick, *args, **kwargs)
self.new_attribute = new_attribute

在此示例中,我将 newick 保留为第一个位置,并决定所有其他参数都在 new_attribute 之后,或者是关键字参数。

 设置父类参数

如果您不愿意,则不必公开父类的所有参数。例如,如果您想创建一个仅执行 format 3 "all branches + all names" 操作的子类,您可以通过编写强制格式:

class TreeAugmented(ete3.Tree):
def __init__(self, newick=None, name=None, dist=None, support=None, new_attribute=None):
super().__init__(newick=newick, format=3, dist=dist, support=support, name=name)
self.new_attribute = new_attribute

(这只是一个展示常见做法的虚拟示例。它在您的上下文中可能没有意义。)

关于python - 如何继承父类的所有功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50995225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com