当前位置: 首页 > 面试题库 >

Python:使类可迭代

郎思远
2023-03-14
问题内容

我继承了一个包含许多大类的项目,这些大类仅由类对象(整数,字符串等)组成。我希望能够检查是否存在属性,而无需手动定义属性列表。

是否可以使用标准语法使其本身可迭代的python ?也就是说,我希望能够使用for attr in Foo:(甚至使用if attr in Foo)遍历类的所有属性,而无需首先创建类的实例。我想我可以通过定义来做到这一点__iter__,但是到目前为止,我还没有完全找到想要的东西。

通过添加如下__iter__方法,我已经实现了一些我想要的东西:

class Foo:
    bar = "bar"
    baz = 1
    @staticmethod
    def __iter__():
        return iter([attr for attr in dir(Foo) if attr[:2] != "__"])

但是,这并不能完全满足我的要求:

>>> for x in Foo:
...     print(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'classobj' object is not iterable

即使这样,这仍然有效:

>>> for x in Foo.__iter__():
...     print(x)
bar
baz

问题答案:

__iter__而不是类本身添加到元类中(假设Python 2.x):

class Foo(object):
    bar = "bar"
    baz = 1
    class __metaclass__(type):
        def __iter__(self):
            for attr in dir(self):
                if not attr.startswith("__"):
                    yield attr

对于Python 3.x,请使用

class MetaFoo(type):
    def __iter__(self):
        for attr in dir(self):
            if not attr.startswith("__"):
                yield attr

class Foo(metaclass=MetaFoo):
    bar = "bar"
    baz = 1


 类似资料:
  • 本文向大家介绍python进阶之自定义可迭代的类,包括了python进阶之自定义可迭代的类的使用技巧和注意事项,需要的朋友参考一下 自定义可迭代的类 列表可以获取列表的长度,然后使用变量i对列表索引进行循环,也可以获取集合的所有元素,且容易理解。没错,使用列表的代码是容易理解,也很好操作,但这是要付出代价的。列表之所以可以用索引来快速定位其中的任何一个元素,是因为列表是一下子将所有的数据都装载在内

  • 本文向大家介绍Python迭代器与可迭代与生成器,包括了Python迭代器与可迭代与生成器的使用技巧和注意事项,需要的朋友参考一下 示例 一个迭代是一个对象,可以返回一个迭代器。具有状态且具有__iter__  方法并返回迭代器的任何对象都是可迭代的。也可能是没有状态的对象,该对象实现了__getitem__方法。-该方法可以获取索引(从零开始),并IndexError在索引不再有效时引发。 Py

  • 本文向大家介绍Python遍历整个可迭代,包括了Python遍历整个可迭代的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 是什么使Python变得有些可迭代?即。可以用它循环 我可以在Python中创建一个可迭代的类吗?如果是这样,怎么办? 问题答案: 要使类可迭代,请编写一个返回迭代器的方法: 版画 该示例使用一个列表迭代器,但你也可以写由制作自己的迭代器一个发电机或通过返回一个迭代器类来定义的实例方法。

  • 本文向大家介绍Python语言什么可以迭代,包括了Python语言什么可以迭代的使用技巧和注意事项,需要的朋友参考一下 示例 Iterable可以是任何一项只能逐一接收的项目。内置的Python集合是可迭代的: 生成器返回可迭代项:            

  • 我对python和编程都是新手,所以我很迷茫。我已经编写了一个“Node”类(如下文底部所示),它实例化了一个二叉搜索树和几个方法,如insert()和elements()(通过按顺序横切树返回元素列表)。我应该使这个类是可迭代的:“iter__(self)应该返回一个NodeIterator,它按照排序顺序从树中返回元素。修改树不应该修改现有的迭代器。”我现在正试图通过在类中插入以下代码来实现这