Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在新类中实例化对象?_Python_Class_Oop_Object - Fatal编程技术网

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

Python 如何在新类中实例化对象?,python,class,oop,object,Python,Class,Oop,Object,有点奇怪的问题,但我想知道如何将对象从一个类导入到另一个类。我想象在扩展程序时添加更多的类方法和属性,我仍然希望能够使用旧数据。我的想法如下: class old_obj: def __init__(self, text): self.name = text def set_amount(self, num): self.amount = num def introduce_yourself(self): print(

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

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
,但不要抱怨
也是旧的。amount
None
。特别是,我希望保留
最早的
具有的任何属性,同时不要求它具有所有可能的属性。有没有办法将一个类的实例复制到一个新类


编辑:为清晰起见进行编辑

您只需通过传递旧对象来初始化新对象即可

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
类继承自
old_obj
,以便
new_obj
具有
old_obj
拥有的所有方法:

class new_obj(olb_obj):
然后,在新类的
\uuuuu init\uuuuu
方法中,可以检查作为参数传递的内容-字符串或对象:

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

可以将对象实例dict复制到新类中

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的小部件,它可能会变得更奇怪


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

稍有不同:

您的新类有一组可能与旧类类似的关注点。这应该指导您更新它和构建有问题的行为的方式。考虑到这一点

  • 在新类中提供类方法,以允许从旧对象构造新对象。不要将此行为作为
    \uuuuu init\uuuu
    的一部分。您的
    \uuuu init\uuuu
    应该承担更有限的责任。对于类方法,使用旧对象的
    \uuuuu dict\uuu
    更新新对象的
    \uuuu dict\uuuu
    就可以完成这项工作

  • 不要使用继承来创建类的新版本。使用继承从一般到具体,或从抽象到具体。否则,您将得到难以理解和更新的代码。(想象一下,为了添加一些新方法,几代人都在进行子分类。)

  • >P>如果方法和属性的数量在增长,您可能需要考虑是否封装了应该分成多个类的数据/行为。指导原则是,您应该封装可能一起更改的数据/行为。也就是说,当您更改程序的实现方式时,不需要更改的内容可能应该与需要更改的内容分开封装。如果您发现很多静态数据都与经常更新的对象类绑定在一起(但只希望导入旧数据不变),那么您可能至少有两组不同的关注点


    我不确定我是否足够清楚和具体,但我特别需要能够根据原始对象具有多少属性来扩展实例化。我将编辑我的原始问题,使之更清楚。@Mathcoller-这个比例。。。关键是,我希望能够插入旧对象,其中一些设置了所有属性,而另一些没有。我想保留他们所有的信息,同时又不需要。为什么不扩展它呢<代码>类new\u obj(old\u obj):。这看起来更像我要找的。我想如果我结合@Błotosmętek的答案,我可以通过传入一个旧对象或传入一个字符串来设置新对象。我想这解决了我的问题,谢谢!