如何在新类中实例化对象?

问题描述 投票:2回答:4

有点奇怪的问题,但是我想知道如何将一个对象从一个类导入另一个类。我想在扩展程序时添加更多的类方法和属性,但我仍然希望能够使用旧数据。我在想如下:

class old_obj:

    def __init__(self, text):
        self.name = text

    def set_amount(self, num):
        self.amount = num

    def introduce_yourself(self):
        print("I am {} and I am {} many".format(self.name, self.amount))

oldest = old_obj("myself")
oldest.set_amount(15)
also_old = old_obj("Bach")

class new_obj:
    def __init__(self):
        #some code
    #more code

我希望能够写类似的东西:

renewed = new_obj(oldest)
also_new = new_obj(also_old)

[这里,我想保留15中的oldest.amount,但不要抱怨also_old.amountNone。特别是,我想保留oldest具有的所有属性,而不要求它具有所有可能的属性。我有办法将类的实例复制到新类吗?

编辑:为清楚起见进行了编辑

python class oop object
4个回答
2
投票

您可以将对象实例字典复制到新类。

from copy import deepcopy

class old_obj:

    def __init__(self, text):
        self.name = text

    def set_amount(self, num):
        self.amount = num

    def introduce_yourself(self):
        print("I am {} and I am {} many".format(self.name, self.amount))

oldest = old_obj("myself")

class new_obj:
    def __init__(self, my_old_obj):
        for var, val in my_old_obj.__dict__.items():
            setattr(self, var, deepcopy(val))
        #some code
    #more code

newest = new_obj(oldest)

我对值进行了深层复制,假设您想要新对象中的唯一值。但这也可能会带来问题,因为并非所有内容都可以复制(例如文件对象)。复制属性(例如,要对生成器执行的操作)时,可能还会有其他问题。而且,如果这像是GUI小部件,可能会变得更加陌生。

但是对于许多对象类型,这将起作用。


1
投票

您可以通过将旧对象传递给它来简单地初始化它。

class old_obj:
    def __init__(self, text):
        self.text = text

oldest = old_obj("myself")

class new_obj:
    def __init__(self, old_inst):
        self.text = old_inst.text 

renewed = new_obj(oldest)

print(renewed.text)

1
投票

首先,使您的new_obj类继承自old_obj,以便new_obj具有old_obj拥有的所有方法:

class new_obj(olb_obj):

然后,在新类的__init__方法中,您可以检查作为参数传递的内容-字符串还是对象:

    def __init__(self, arg):
        if isinstance(arg, str):
            self.text = arg
        elif isinstance(arg, old_obj):
            self.text = arg.text 
        else:
            raise TypeError

0
投票

略有不同:

您的新班级可能有一系列与旧班级相似的问题。这应该指导您更新它的方式并建立有问题的行为。考虑到这一点...

  1. 在新类中提供一个类方法,以允许从旧对象构造新对象。请勿将此行为纳入__init__的一部分。您的__init__应该承担的责任更加有限。对于class方法,使用旧对象的__dict__更新新对象的__dict__就可以了。

  2. 不要使用继承来制作新版本的类。使用继承从一般到特定或从抽象到具体。否则,您将得到难以理解和更新的代码。 (想像一下几代人下来只是为了添加一些新方法的子类。)

  3. 如果方法和属性的数量在增加,您可能要考虑是否要封装应分为多个类的数据/行为。指导原则是,您应该封装可能一起更改的数据/行为。也就是说,当您更改实施程序的方式时,不需要更改的内容可能应该与需要更改的内容分开封装。如果您发现很多静态数据与您经常更新的对象类绑定在一起(但只想原样导入旧数据),那么至少可能要考虑两组不同的问题。

© www.soinside.com 2019 - 2024. All rights reserved.