从 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']
我有一个基础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']