使用变量来命名另一个变量

时间:2019-07-24 15:01:16

标签: python

比方说,我有一个狗的字典,其中的键是狗的名字,值是Dog类的实例。

my_dogs = {'Ollie': Dog(...), 'Lassie': Dog(...)}

如果我想认识我的狗,可以通过钥匙进入它们

my_dogs['Ollie']

但是我希望将此结构作为一个类,就像

class MyDogs():
    def __init__(self):
        self.ollie = Dog()
        self.lassie = Dog()

所以我可以像下面那样访问我的狗

my_dogs = MyDogs()
my_dogs.lassie   

使用字典,我可以通过将关键字设置为狗的名字来为其命名,但是在该类中变量是硬编码的,这是我不想要的。

问题:我可以定义一个名称存储在另一个变量中的变量吗?像这样:

class MyDogs():
    def __init__(self, dog_names):
        self.eval(dog_names[0]) = Dog()
        self.eval(dog_names[1]) = Dog()

这样,MyDogs将有两个实例,它们以作为参数传递的dog_names命名。

这可能吗?这是一个好习惯还是我应该改变结构?

2 个答案:

答案 0 :(得分:1)

您可以为此使用setattr

class MyDogs():
    def __init__(self, dog_names):
        for dog_name in dog_names:
          setattr(self, dog_name, Dog())

答案 1 :(得分:0)

也许有些矫kill过正,但是您可以使用MutableMapping来实现一个模仿字典的类,这样您就可以使用建议的界面:

from collections.abc import MutableMapping


class Dog:

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

    def __repr__(self):
        return str(self.name)


class MyDogs(MutableMapping):

    def __init__(self, dog_names):
        for name in dog_names:
            self[name] = Dog(name)

    def __getitem__(self, key):
        return self.__dict__[key]

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        del self.__dict__[key]

    def __iter__(self):
        return iter(self.__dict__)

    def __len__(self):
        return len(self.__dict__)


my_dogs = MyDogs(['lassie', 'ollie'])
print(my_dogs.lassie)
print(my_dogs.ollie)

退出:

'lassie'
'ollie'