比方说,我有一个狗的字典,其中的键是狗的名字,值是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命名。
这可能吗?这是一个好习惯还是我应该改变结构?
答案 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'