繁体   English   中英

如何在新的 class 中实例化 object?

[英]How to instantiate an object in a new class?

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

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)

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

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

您可以将 object 实例字典复制到新的 class。

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)

假设您想要新的 object 中的唯一值,我对值进行了深度复制。 但这也可能有问题,因为并非所有内容都可以复制(例如文件对象)。 复制属性时可能会出现其他奇怪的情况,例如您想用生成器做什么。 如果这是一个类似于 GUI 小部件的东西,它可能会变得更加陌生。

但是对于很多 object 类型,这会起作用。

您可以简单地通过传递旧的 object 来初始化新的 object。

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)

首先,让你的new_obj class 继承自old_obj ,这样new_obj就拥有old_obj的所有方法:

class new_obj(olb_obj):

然后,在新 class 的__init__方法中,您可以检查作为参数传递的内容 - 字符串或 object:

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

略有不同的取法:

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

  1. 在新的 class 中提供 class 方法,以允许从旧的 ZA8CFDE6331BD59EB2AC96F8911ZB4 构造新的 object。 不要让这种行为成为__init__的一部分。 您的__init__应该承担更有限的责任。 对于 class 方法,使用旧对象的__dict__ __dict__可以了。

  2. 不要使用 inheritance 来制作新版本的类。 使用 inheritance 从一般到具体或从抽象到具体。 否则,您最终会得到难以理解和更新的代码。 (想象一下为了添加一些新方法而只进行子类化的几代人。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM