从给定的字符串动态创建类实例,并在字典中保存深度副本

2024-09-23 08:23:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一组给定的字符串动态地创建多个类实例(复制的),然后就被它卡住了。你知道吗

我的方法是:

# -*- coding: utf-8 -*-


# I have an number of different classes
class FourLegs:
    def __init__(self, name, age):
        self.name = name
        self.age = age


class TwoOrNoLegs:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# And only the class name and some attributes (normally in a big CSV file)
dc = dict(zip(range(0, 5), [('FourLegs', 'Dog', 11),
                            ('TwoOrNoLegs', 'Chicken', 22),
                            ('FourLegs', 'Cat', 33),
                            ('FourLegs', 'Mice', 44),
                            ('TwoOrNoLegs', 'Snake', 55)]))


# And want to create different objects depending on the given class name
# and attributes an store them in a dict
zoo = {}
for k, v in dc.items():
    an = eval(v[0])
    an.name = v[1]
    an.age = v[2]
    print(an, an.name, an.age)
    zoo[an.name] = an

for k, v in zoo.items():
    print(k, v.name, v.age)

它提供:

<class '__main__.FourLegs'> Dog 11
<class '__main__.TwoOrNoLegs'> Chicken 22
<class '__main__.FourLegs'> Cat 33
<class '__main__.FourLegs'> Mice 44
<class '__main__.TwoOrNoLegs'> Snake 55
Snake Snake 55
Mice Mice 44
Dog Mice 44
Cat Mice 44
Chicken Snake 55

因为我使用的是(eval()),它似乎只创建实例的引用(没有副本)。你知道吗

我想要产生的结果(如果我手动创建实例,它就可以工作)如下:

<class '__main__.FourLegs'> Dog 11
<class '__main__.TwoOrNoLegs'> Chicken 22
<class '__main__.FourLegs'> Cat 33
<class '__main__.FourLegs'> Mice 44
<class '__main__.TwoOrNoLegs'> Snake 55
Snake Snake 55
Mice Mice 44
Dog Dog 11
Cat Cat 33
Chicken Chicken 22

我真的被困在这里了,我很高兴得到每一个提示!你知道吗

对于基于字符串的动态创建的实例,是否也有方法实现这一点?你知道吗


Tags: 实例nameinselfanagemainclass
1条回答
网友
1楼 · 发布于 2024-09-23 08:23:37

您没有创建实例,而是直接在类上设置属性。因为您每次都在改变相同的两个类上的属性,所以您会看到最后一组值反映在这两个类的属性中。你知道吗

呼叫您的班级,输入姓名和年龄:

for k, v in dc.items():
    an = eval(v[0])(v[1], v[2])
    print(an, an.name, an.age)
    zoo[an.name] = an

你应该尽量避免在这里使用eval();把你的类放在一个字典里并用它作为查找,或者使用globals()字典(但是要注意,这样也可以调用其他全局变量):

classes = {'FourLegs': FourLegs, 'TwoOrNoLegs': TwoOrNoLegs}

for k, v in dc.items():
    clsname, name, age = v
    an = classes[clsname](name, age)
    print(an, an.name, an.age)
    zoo[an.name] = an

相关问题 更多 >