簡體   English   中英

如何迭代類方法

[英]How to iterate over class methods

如果我導入一個模塊並且我想迭代其中的靜態方法,有沒有辦法做到這一點?

在模塊中:

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響應。 有比使用它更好的方法嗎?

您收到無響應,因為您沒有返回任何內容。 沒有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 (這里我將顯式傳遞給它作為第三個參數)。 由於你不能調用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'

你的功能有幾個問題:

  1. 它不需要參數,所以你依賴於變量訪問的范圍;
  2. 它沒有return任何東西;
  3. 如果兩個方法都存在,哪一個是最后的result取決於字典中鍵的順序。

嘗試:

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

並考慮為搜索這個詞做一個論證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM