gpt4 book ai didi

python - 从python中的父类(super class)获取属性

转载 作者:行者123 更新时间:2023-11-28 21:15:15 25 4
gpt4 key购买 nike

我有一个基类,一堆子类,对于这些子类中的每一个,我都有另一组子子类。例如:

class BaseClass(object):
def __init__(self):
with open(config.txt) as f
self.config_array = f.readlines()

class FirstOrderSubClass(BaseClass):
def __init__(self, name):
self.name = name

class SecondOrderSubClass(FirstOrderSubClass):
def __init__(self, name, version):
self.name = name
self.version = version
super(SecondOrderSubClass, self).__init__(self.name)
# needed to access self.config_array
print self.config_array

我需要获取 SecondOrderSubClass__init__() 方法来进行以下分配:self.lines = self.config_array

编辑:添加行 print self.config_array。如果我运行我得到的代码:

TypeError: __getattr__() takes exactly 1 argument (2 given)

最佳答案

BaseClass.__init__() 运行以设置属性之前,您无法访问 self.config_array

修复 FirstOrderSubClass 以同时调用基类 __init__ 或直接调用它。

修复 FirstOrderSubClass 可能是最好的方法:

class FirstOrderSubClass(BaseClass):
def __init__(self, name):
super(FirstOrderSubClass, self).__init__()
self.name = name

但是,您的 __init__ 方法签名不匹配,因此您不能在此处依赖合作行为;一旦你在层次结构中添加了一个混合类,事情就可能而且很可能会崩溃。参见 *Python's super() is considered super!雷蒙德·赫廷格 (Raymond Hettinger) 或其后续作品 PyCon presentation解释为什么你希望你的签名匹配。

直接调用 BaseClass.__init__ 未绑定(bind)方法(显式传入 self)也可以:

class SecondOrderSubClass(FirstOrderSubClass):
def __init__(self, name, version):
super(SecondOrderSubClass, self).__init__(name)
self.version = version
BaseClass.__init__(self)

请注意,如果您要要求 FirstOrderSubClass.__init__ 做完全相同的事情,那么分配给 self.name 是没有意义的。

使用 super() 的正确方法是让所有方法至少接受所有相同的参数。由于 object.__init__() 永远不会,这意味着您需要一个不使用 super() 的哨兵类; BaseClass 在这里会做得很好。您可以使用 *args**kw 来捕获任何其他参数并忽略它们以使协作子类工作:

class BaseClass(object):
def __init__(self, *args, **kw):
with open(config.txt) as f
self.config_array = f.readlines()

class FirstOrderSubClass(BaseClass):
def __init__(self, name, *args, **kw):
super(FirstOrderSubClass, self).__init__(*args, **kw)
self.name = name

class SecondOrderSubClass(FirstOrderSubClass):
def __init__(self, name, version, *args, **kw):
super(SecondOrderSubClass, self).__init__(name, *args, **kw)
self.version = version

关于python - 从python中的父类(super class)获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30501525/

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