如何迭代类方法

时间:2014-06-22 07:33:02

标签: python python-2.7

如果我导入一个模块并且我想迭代其中的静态方法,有没有办法做到这一点?

在模块中:

class duck():
    @staticmethod
    def duck_quack():            
        return 'Quacks like a duck'
    @staticmethod
    def person_walk():            
        return 'Walks like a person'

在控制器中:

from applications.... import duck

m = duck()

def result_m():
    for stuff in dir(m):
        if 'person' in stuff:
            result = stuff
        elif 'duck' in stuff:
            result = stuff

相反,我不断收到None回复。有没有比使用它更好的方法?

2 个答案:

答案 0 :(得分:1)

您的功能有几个问题:

  1. 它没有参数,所以你依赖于变量访问的范围;
  2. 它没有return任何东西;和
  3. 如果两种方法都存在,哪一种最后result取决于字典中键的顺序。
  4. 尝试:

    def result_m(m):
        for stuff in dir(m):
            if 'person' in stuff:
                result = stuff
            elif 'duck' in stuff:
                result = stuff
        return result
    

    并考虑为要搜索的单词创建一个参数。

答案 1 :(得分:1)

您收到无响应,因为您没有返回任何内容。没有return语句的方法返回None。

我不确定你的方法的最终目标是什么,但我会这样做:

obj = Duck()

def say_something(keyword):
     return getattr(obj, keyword, None)

print(say_something('duck')())

以下是一个例子:

>>> class Foo(object):
...     @staticmethod
...     def duck():
...        return 'Quak!'
...     @staticmethod
...     def person():
...        return 'Hello'
...
>>> a = Foo()
>>> def say_something(thing):
...     return getattr(a, thing, None)
...
>>> print(say_something('duck')())
Quak!
>>> print(say_something('person')())
Hello
默认情况下,

getattr将返回None(此处我将其显式传递为第三个参数)。由于您无法调用无,因此您可以获得此结果:

>>> print(say_something('Foo')())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

所以如果你存储结果并检查它不是None,或者返回其他一些可调用的,那么它是最好的:

>>> def say_something(thing):
...     return getattr(a, thing, lambda: 'Not Found')
...
>>> say_something('duck')()
'Quak!'
>>> say_something('person')()
'Hello'
>>> say_something('foo')()
'Not Found'