【发布时间】:2018-03-20 14:04:57
【问题描述】:
我有一个 Python 类(它实际上不是我的,它来自一个包,所以我不想编辑这个)。最小的例子(不切实际):
import os
class SuperClass:
def __init__(self):
# Do something, for example
self.a = 0
pass
def from_file(filename):
# Do something with the file,
# use it to create superclass
# instance obj. For example...
obj = SuperClass()
obj.a = os.stat(filename).st_size
return obj
现在我想创建这个超类的一个子类,它的初始化总是来自一个文件——也就是说,我想做类似的事情
class SubClass(SuperClass):
def __init__(self, filename):
self = SuperClass.from_file(filename)
这不起作用(我没想到会这样):我没有收到异常,但子类未正确初始化。例如,如果SuperClass 有一些实例值a,它总是被设置,那么做
new_subclass_instance = SubClass('/filepath/file')
print(new_subclass_instance.a)
会给AttributeError: type object 'SubClass' has no attribute 'a'。
如何使用父类中的from_file 函数进行初始化?
【问题讨论】:
-
请编辑您的问题并添加您得到的例外情况。您发布的代码也不起作用,您忘记了第一堂课中的
def -
@FrancescoMontesano 也不例外。他们基本上是在问如何使用
from_file方法作为子类的构造函数。 -
@FrancescoMontesano,正如所指出的,我没有直接得到异常,但我已经稍微更新了问题以显示故障所在。
-
@MeesdeVries:我看不出异常与其他异常之间的联系。你期待什么?
a未在代码中定义,因此您会收到错误消息。如果我尝试您的代码,我会在初始化SubClass时得到:NameError: name 'obj' is not defined。另外:您确定from_file是正确的并且您没有忘记装饰器吗? -
@FrancescoMontesano,我发布的内容并不意味着 实际代码 只是为了说明。超类中的注释行是实际代码的替身。特别是,在该代码中,
obj将被构造,并且在这两种方法中,值a都将被设置。如果可以使代码更清晰,我可以扩展代码。换句话说,关键是超类没有接受文件名的__init__()方法,它只有一个类函数,它返回一个使用文件名中的数据初始化的实例。在子类中,我想从文件名中获得一个实际的__init__()。
标签: python class subclass superclass