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

标签 python oop attributes coding-style

<分区>

是否有充分的理由将对象列表存储为“子属性”?在下面的示例中,我在 animals 下的 Zoo 中存储了几个动物对象。属性,例如 zoo.animals.<animal object referenced by name> .这种语法使访问存储动物的属性变得更加容易,我想知道这种结构是否有我尚未考虑的缺点:

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

最佳答案

在我看来,这样做会使您的代码难以调试、不灵活且不可读。这是个坏主意。如果发生什么情况,例如:

  1. 你有一个包含空格的动物名字吗?比如“电鳗”?
  2. 如果你想遍历动物,你必须做
    for name in vars(obj):
        print(getattr(obj, name))
    
    • 本质上,您可能必须重新实现所有标准容器功能,例如插入、添加、删除、过滤等,或者使用非常不直观的语法。
  3. 您将如何将其与另一个动物园合并或过滤?如果需要,也无法对这些值进行排序。

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


因为您主要是在寻找快速便捷的访问方式,请使用 dictOrderedDict:

class Animal(object):
    def __init__(self, name, num_legs, 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', 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

关于python - 按名称引用对象作为属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54376248/

相关文章:

c# - 使用方法属性消除冗余代码

Python - 属性错误 : 'NoneType' object has no attribute 'findAll'

python - 如何在python中找到矩阵对角线上下元素的总和?

python - 我想通过在我的数据框中添加 2 个连续的列来插入新列

java - 如何以某种方式实例化部分实现接口(interface)的类

游戏组件的 Javascript 类结构

c++ - 在事先不知道特定成员函数的情况下从另一个类访问成员函数

android - eclipse 中的宽度错误

python - 查询可选参数

python - 控制for循环(python)