Python:查找具有特定属性的所有类

时间:2015-05-08 20:24:59

标签: python attributes

我看到了一个几乎相同的C#帖子,但找不到与Python相关的任何内容。

因为我刚刚开始学习Python,所以我有一种感觉,我会想到我之前使用的属性,如.count(),并忘记哪些对象具有该属性。

我想编写一个函数,给定目录列表和某个属性,将返回一组具有该属性的对象类。 (理想情况下,我可以搜索在运行此函数时导入的所有类对象,而不仅仅是dir()中的内容

这是我到目前为止所做的:

    def whereattr(directory_list, attrib):
        haveit = set()
        for obj in directory_list:
            try:
                haveit.add(type(eval(obj)) if hasattr(eval(obj), attrib) else '')
            except:
                pass
        return haveit

我正在使用try / except,因为我发现我无法评估所有对象。

示例:

    In [244]: whos
    Variable       Type         Data/Info
    -------------------------------------
    DataFrame      type         <class 'pandas.core.frame.DataFrame'>
    Series         type         <class 'pandas.core.series.Series'>
    count          int          5
    counts         dict         n=97
    first_letter   function     <function <lambda> at 0x1039daf50>
    frame          DataFrame          _heartbeat_        <...>n[3560 rows x 18 columns]
    get_counts     function     <function get_counts at 0x10770ac08>
    haveit         list         n=0
    itertools      module       <module 'itertools' from <...>ib-dynload/itertools.so'>
    json           module       <module 'json' from '/Use<...>on2.7/json/__init__.pyc'>
    letter         str          A
    line           str          { "a": "Mozilla\/4.0 (com<...>.935799, -77.162102 ] }\n
    names          _grouper     <itertools._grouper object at 0x103b51b90>
    path           str          pydata-book/ch02/usagov_b<...>2012-03-16-1331923249.txt
    rec            dict         n=16
    records        list         n=3560
    results        Series       0                Mozilla/<...>ngth: 3440, dtype: object
    test           set          set([])
    testfun        function     <function testfun at 0x107b2d938>
    tz             unicode      Asia/Seoul
    tzs            list         n=3440
    vkp            list         n=97
    whereattr      function     <function whereattr at 0x107b2d9b0>
    x              unicode      Mozilla/4.0 (compatible; <...>T4.0E; .NET CLR 1.1.4322)

    In [247]: whereattr(dir(), "count")
    Out[247]: {'', str}

有人请告诉我我做错了什么吗?显然,list,Series等都有一个count属性,应该包括在内。

另外,如果你想骂我代码中的任何其他问题,我可以接受(好的)批评。

3 个答案:

答案 0 :(得分:2)

dir在这里有点无用,我宁愿推荐localsglobals,因为它会为您提供参考,因此您不需要使用eval。

[label for label, ref in locals().items() if hasattr(ref, 'count')]

显然你可以把它放到像

这样的函数中
whereattr = lambda scope, attr: [label for label, ref in scope.items() if hasattr(ref, attr)]

你就像这样使用它

whereattr(locals(), 'count')

whereattr(vars(__builtin__), 'count')

答案 1 :(得分:0)

您不应该使用eval()来查找对象。尝试这样的事情:

def whereattr(directory_list, attrib):
    haveit = set()
    scope = globals()
    for obj_name in directory_list:
        if obj_name in scope:
            obj = scope[obj_name]
            if hasattr(obj, attrib):
                haveit.add(type(obj))
    return haveit

这将找到具有给定属性的全局范围内的所有对象。

修改:尽管使用eval()是不好的做法,但原始代码应该有效。所以我实际上不确定底层问题是什么。 (参见我对原始问题的评论。)

答案 2 :(得分:0)

您应该将您的except子句更改为except Exception, e: print str(e)。它告诉你你做错了什么。如果你丢失eval,它似乎有效。

def whereattr(directory_list, attrib):
        haveit = set()
        for obj in directory_list:
            try:
                haveit.add(type(obj) if hasattr(obj, attrib) else '')
            except Exception, e:
                print str(e)
        return haveit 

>>> whereattr([list], "count")
set([<type 'type'>])
>>>