我看了很多问题,找到了我的问题的答案,但我没有成功。问题可能是,我只是不知道我应该看哪些关键字。所以我的问题如下:
我有一个程序,它具有多级继承,我试图弄清楚如何将对象的类更改为子类的最佳方法。假设我有以下代码:
class A(object):
def __init(self, filename, ..)
super(A, self).__init__()
...some assignments here
class B(A):
def __init(self, filename, ..)
super(B, self).__init__()
...some assignments here
class C(A):
def __init(self, filename, ..)
super(C, self).__init__()
...some assignments here
依旧......
我总是想开始初始化A类的对象。根据所使用文件的类型,分配可能会有所不同,根据这些分配,我可以确定它是什么类型的文件。所以现在我想将对象的类更改为适合的类。
我知道我可以将A对象传递给B或C并使用复制或深度复制,但在A中我指定的对象的引用不应该更改,而其他一些对象应该更改。在初始化B或C之后,我还需要删除A的对象。
class B(A):
def __init__(self, filename, objA = None):
if objA is not None:
self.__dict__ = copy.deepcopy(objA.__dict__)
del(objA)
else:
super(B, self).__init__(filename)
还可以通过将_ 类属性更改为另一个类并使用某种新类的更新方法来实现另一种可能性。
我想知道,建议采用哪两种方法,或者哪种方法更好。提前谢谢。
答案 0 :(得分:3)
你想要的是一个工厂:一个打开文件的函数,读取它需要读取的东西,找出它是什么类型的文件,然后初始化并返回相应类的对象。
如果你想让它成为一个类,你想要覆盖__new__()
然后返回所需类的对象而不是它自己的类。 (您也可以使用元类并在其上覆盖__call__()
。)
您也可以在实例化后更改实例的类,方法是将其__class__
属性更改为指向所需的类。这样做会有效,但对于那些阅读代码的程序员来说,工厂会更熟悉。
答案 1 :(得分:1)
此代码将说明您要执行的操作
class B(object):
def x(self):
print 'b'
class A(object):
def x(self):
print 'a'
现在我们创建两个对象
a = a()
b = b()
a.x()
a
b.x()
b
现在如果你想让'a'成为B对象
a.__class__ = type(b)
或
a.__class__ = B
现在x属性来自B类。
a.x()
b