从 python 中的超级 class 获取属性

Get attribute from a super class in python

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

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 也调用基础 class __init__ 或直接调用它。

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

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

但是,您的 __init__ 方法签名不匹配,因此您不能在此处依赖合作行为;一旦在层次结构中添加混入 class,事情就可能而且很可能会崩溃。请参阅 *Python's super() is considered super! by Raymond Hettinger, or it's followup PyCon presentation 以解释您希望签名匹配的原因。

直接调用 BaseClass.__init__ 未绑定方法(显式传入 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() 的哨兵 class; BaseClass 在这里会做得很好。您可以使用 *args**kw 来捕获任何额外的参数并忽略它们以使合作 subclassing 工作:

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

您必须调用 FirstOrderSubClass super 方法:

class BaseClass(object):
    def __init__(self):
        with open("config.example.txt",'w') as f:
            f.write("Hello world")
        with open("config.example.txt") as f:
            self.config_array = f.readlines()

class FirstOrderSubClass(BaseClass):
    def __init__(self, name):
        super(FirstOrderSubClass,self).__init__()
        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

grandchild = SecondOrderSubClass("peter",2.0)
print grandchild.config_array
##>>> 
##['Hello world']