python-通过名称引用对象作为属性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-通过名称引用对象作为属性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1836字,纯文字阅读大概需要3分钟。
内容图文
![python-通过名称引用对象作为属性](/upload/InfoBanner/zyjiaocheng/650/3faba09477384d58823bf2c93ef55798.jpg)
是否有充分的理由将对象列表存储为“子属性”?在下面的示例中,我将几个动物对象存储在Zoo中的animals属性下,例如zoo.animals.<按名称引用的动物对象>.这种语法使访问存储的动物的属性更加容易,我想知道是否还没有考虑到这种构造的缺点:
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, 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-通过名称引用对象作为属性全部内容,希望文章能够帮你解决python-通过名称引用对象作为属性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。