关于类继承,我一直停留在这一点上,但是我还没有想出一种干净的方法。我有一些基础课:
class Foo:
""" Parent class. """
def __init__(self,a,b):
self.a = a
self.b = b
def product(self):
return self.a * self.b
此类包含我从某些数据文件中加载的信息。我想使用类属性来存储与该数据相关的各种信息。例如,如果我想创建一个报告来告诉我a和b的商,我想创建类似以下内容的
class Bar(Foo):
""" Child class. """
def __init__(self,foo_object):
# What I want to avoid:
self.a = foo_object.a
self.b = foo_object.b
def quotient(self):
return self.a / self.b
很明显,在我的实际应用程序中还有更多的类属性。将Foo对象的所有属性分配到新的Bar对象变得非常繁琐。
一旦创建了Foo对象,是否有一种更优雅的方法将Foo对象“扩展”为Bar对象?
编辑:
对不起,如果我没有足够清楚地陈述我的目标;我发现我的要求有些困惑。我已经创建了具有许多属性的Foo对象。我想创建一个名为Foo的子类,称为Bar, later ,其中包含这些属性以及一些特定于我的应用程序“区域”的其他属性。
因此,我希望能够传递一个已经实例化的Foo对象,并将其属性值传递到Bar中相同的属性中,而无需逐个手动进行操作。
我相信Flob的答案就是我想要的。谢谢!
答案 0 :(得分:0)
我不确定我“一旦创建Foo
对象就意味着什么”。
要初始化由父类定义的属性,请使用以下方法:
class Bar(Foo):
""" Child class. """
def __init__(self,a,b):
super().__init__(a,b)
def quotient(self):
return self.a / self.b
让超类的__init__()
方法继续执行初始化a
和b
的工作。
请注意,b = B()
仅创建一个对象,而不是两个。
在您发布的代码中,Bar.__init__()
似乎将Foo
对象作为其参数之一。从技术上讲,这是在一个Foo
对象中包装一个Bar
对象的情况-如果您这样做,实际上就不需要{{1} }成为Bar
的子类:
Foo
答案 1 :(得分:0)
可以在创建对象后更改其类别。不用将对象的内容拆包成一个新的对象,而是更改它用于查找方法的类:
class Foo:
def __init__(self, a, b):
self.a = a
self.b = b
class Bar(Foo):
def quotient(self):
return self.a/self.b
f = Foo(1, 2)
f.__class__ = Bar
f.quotient() # 0.5
这通常不是必需的(我不建议在这里使用它)。相反,您可以直接创建一个Bar
对象:
b = Bar(1, 2)
b.quotient()
Bar
继承了__init__
的{{1}}方法,因此您不必重新定义它。
另一种选择是使用不是方法的函数:
Foo
现在,即使您的def quotient(obj):
return obj.a/obj.b
对象不知道quotient(Foo(1,2))
函数,您也可以计算Foo
。
答案 2 :(得分:0)
一个类可以从基类继承,但是一个对象不能从另一个对象继承。它可以是副本(可能带有其他属性),也可以包装原始对象。第一种情况是真正的继承策略(子实例必须成为基类的实例,并且必须自行初始化),第二种情况是聚合或包含策略。
但是请注意,第二个注意事项,主要是因为 child 对象不是基类的实例(isinstance(child, Foo)
为假)。这意味着这里没有一个合适的大小,您将不得不选择一种模式,即继承还是聚合。
答案 3 :(得分:0)
您可以通过在子类内部启动父类来直接继承信息。创建父类的实例后,可以使用vars(object)
访问其所有属性,这将返回一个与该对象相关的所有属性的字典。例如,假设您有一个Foo
类:
class Foo:
def __init__(self, a, b):
self.a = a
self.b = b
和test_parent
是此类的实例。
test_parent = Foo(a='Hello', b='World')
现在,在创建Bar
子类时,请执行以下操作:
class Bar(Foo):
def __init__(self, foo_object):
a, b = vars(foo_object).values() #get all properties of parent class object
Foo.__init__(self, a, b) # initiate parent class
def say_hello(self):
print('{} {}'.format(self.a, self.b))
创建Bar
类的实例并调用say_hello
:
test_child = Bar(test_parent)
test_child.say_hello()
输出:
"Hello World"