Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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_Python 3.x_Class_Object - Fatal编程技术网

Python 如何在父类内创建子类的对象?

Python 如何在父类内创建子类的对象?,python,python-3.x,class,object,Python,Python 3.x,Class,Object,我在test.py中有以下代码: 类Parentobject: 定义初始自我: self.myprop1=some self.myprop2=事物 自我定义: 复制=父项 copy.myprop1=self.myprop1 copy.myprop2=self.myprop2 返回副本 test2.py中的另一个: 从测试导入父级 类别ChildParent: 定义自身: 返回{},{}.formatself.myprop1,self.myprop2 obj1=子对象 obj2=obj1。重复 o

我在test.py中有以下代码:

类Parentobject: 定义初始自我: self.myprop1=some self.myprop2=事物 自我定义: 复制=父项 copy.myprop1=self.myprop1 copy.myprop2=self.myprop2 返回副本 test2.py中的另一个:

从测试导入父级 类别ChildParent: 定义自身: 返回{},{}.formatself.myprop1,self.myprop2 obj1=子对象 obj2=obj1。重复 obj2.myprop1=另一个 obj2.myprop2=stuff 访问属性 打印对象J1,对象J1.myprop1,,对象J1.myprop2 打印对象J2、对象J2.myprop1、对象J2.myprop2 使用Child方法 printobj1,,strobj1 printobj2,,strobj2 运行test2.py时,输出为:

一些东西 obj2,另一个,东西 一些东西 obj2, 我想知道是否可以在父类中创建一个Child实例,但是因为可能会有更多的Child,我想知道self的类并创建该类的实例,复制属性,然后返回对象副本

此代码的目标是输出以下内容:

一些东西 obj2,另一个,东西 一些东西 obj2,另一个,东西 这意味着obj2是子对象而不是父对象

希望这是清楚的,谢谢

编辑:我不想使用copy.copy或copy.deepcopy。如果您只想获得一个副本并实现一个更简单的解决方案,请查看使用这些函数的另一个相关问题。
但是,这个问题的目的是获得另一种实现方法,并且知道如何从对象获取类,以及如何获取同一类的另一个实例。这个特殊的案例显示了类之间的父子关系,我添加了它来显示我怀疑的整个上下文。

只是不要硬编码类,使用type来检索实例的类,类似于:

class Parent(object):
    def __init__(self):
        self.myprop1 = "some"
        self.myprop2 = "thing"

    def duplicate(self):
        cls = type(self)
        copy = cls()
        copy.myprop1 = self.myprop1
        copy.myprop2 = self.myprop2
        return copy
要创建副本实例,可以使用:

def duplicate(self):
    copy = type(self)()
    ...
但是更好的解决方案是使用

是的,使用typeself获取对象的类型。还考虑用DuntType方法实现复制,以支持构建副本。
类方法可能更好,因为它可以让您控制所创建对象的类型

class Parent(object):
    def __init__(self):
        self.myprop1 = "some"
        self.myprop2 = "thing"

    @classmethod
    def from_object(cls: 'T', obj: Parent) -> 'T':
        copy = cls()
        copy.myprop1 = obj.myprop1
        copy.myprop2 = obj.myprop2
        return copy


class Child(Parent):
   def __str__(self):
        return "{}, {}".format(self.myprop1, self.myprop2)


obj1 = Child()
obj2 = Child.from_object(obj1)  # A new Child
obj3 = Parent.from_object(obj1)  # A new Parent

另一方面,为什么Parent.\uuu init\uuuu不接受参数?这是否回答了您的问题@chepner感谢您的提问,您的意思是将字符串文本作为参数放在子构造函数中,以便父构造函数_uinit _;接受并分配它吗?如果是这样的话,这是因为我想知道如何在父类中创建子类的实例,我创建了这个简单的代码来尽可能地显示这个特定的问题和上下文。@Moberg感谢您的评论,这是一个很好的选择。尽管如此,它取代了复制方法,我想知道如何在不使用copy或deepcopy的情况下实现这一点,因为在我目前正在编写的代码中,这两种方法都不适用于我。因此,我将编辑问题,添加我不想使用copy或deepcopy的内容。谢谢谢谢我将替换副本并改为使用_copy _;
class Parent(object):
    def __init__(self):
        self.myprop1 = "some"
        self.myprop2 = "thing"

    @classmethod
    def from_object(cls: 'T', obj: Parent) -> 'T':
        copy = cls()
        copy.myprop1 = obj.myprop1
        copy.myprop2 = obj.myprop2
        return copy


class Child(Parent):
   def __str__(self):
        return "{}, {}".format(self.myprop1, self.myprop2)


obj1 = Child()
obj2 = Child.from_object(obj1)  # A new Child
obj3 = Parent.from_object(obj1)  # A new Parent