python-通过名称引用对象作为属性

是否有充分的理由将对象列表存储为“子属性”?在下面的示例中,我将几个动物对象存储在Zoo中的animals属性下,例如zoo.animals.@H_404_2@.这种语法使访问存储的动物的属性更加容易,我想知道是否还没有考虑到这种构造的缺点:

class Animal(object):
    def __init__(self,name,num_legs,furry):
        self.name = name
        self.num_legs = num_legs
        self.furry = furry

class ObjAsAttributes(object):
    def __init__(self,**kwargs):
        for k,v in kwargs.items():
            setattr(self,k,v)

class Zoo(object):
    def __init__(self,animals):
        self.name = 'my zoo'
        self.hours = '8am-6pm'
        animals = {animal.name:animal for animal in animals}
        self.animals = ObjAsAttributes(**animals)




animal_list = [Animal(name='bird',num_legs=2,furry=False),Animal(name='giraffe',num_legs=4,furry=True),Animal(name='octopus',num_legs=8,furry=False)]

zoo = Zoo(animal_list)
zoo.animals.bird.num_legs
# returns 2
最佳答案
我认为,这样做会使您的代码难以调试,不灵活且不可读.这是一个坏主意.如果发生以下情况,会发生什么情况:

>您的动物名包含空格?如“电鳗”?
>如果要遍历动物,则必须做

for name in vars(obj):
    print(getattr(obj,name))

>本质上,您可能必须重新实现所有标准容器功能,例如插入,添加,删除,过滤等,或者使用非常不直观的语法.

>您如何将其与另一个动物园合并或过滤?此外,如果需要,也无法对这些值进行排序.

属性旨在“保留”建模对象的数据或“描述特征”.您仅应将它们用于此目的.

当您主要在寻找快速便捷的访问方式时,请使用dict或OrderedDict:

class Animal(object):
    def __init__(self,furry):
        self.name = name
        self.num_legs = num_legs
        self.furry = furry

class Zoo(object):
    def __init__(self,animals):
        self.name = 'my zoo'
        self.hours = '8am-6pm'
        self.animals = {animal.name:animal for animal in animals}

animal_list = [Animal(name='bird',furry=False)]

zoo = Zoo(animal_list)
zoo.animals['bird'].num_legs
# returns 2

相关文章

在这篇文章中,我们深入学习了XPath作为一种常见的网络爬虫技巧。XPath是一种用于定位和选择XML文档中特...
祝福大家龙年快乐!愿你们的生活像龙一样充满力量和勇气,愿你们在新的一年里,追逐梦想,勇往直前,不...
今天在爬虫实战中,除了正常爬取网页数据外,我们还添加了一个下载功能,主要任务是爬取小说并将其下载...
完美收官,本文是爬虫实战的最后一章了,所以尽管本文着重呈现爬虫实战,但其中有一大部分内容专注于数...
JSON是一种流行的数据传输格式,Python中有多种处理JSON的方式。官方的json库是最常用的,它提供了简单...
独立样本T检验适用于比较两组独立样本的均值差异,而配对T检验则适用于比较同一组样本在不同条件下的均...