2016-12-09 16 views
1

私はモデルモデルを持っているDjangoプロジェクトに取り組んでいます。オブジェクトメソッドを反復処理してフィルタリングする方法は?

このモデルには、属性、メソッド、サブクラスがあります。私は反復し、 "統計"属性でメソッドを取得したい。だから、

class Model(models.Model): 
    name = ... 

    def dont_want(self): 
     return 'foo' 

    def want(self): 
     statistic = True 
     return self.name 

    def want_too(self): 
     statistic = True 
     return self.name 

    def get_methods_with_statistic_attribute(self): 
     # WHAT TO DO 
     return methods 


model = Model(name='Peter') 
for method in model.get_methods_with_statistic_attribute(): 
    print method 

>>> 'Peter' 
>>> 'Peter' 

が、それは可能ですか?

は、私が試した:

return [a for a in dir(self) if hasattr(getattr(self,a),'statistic')] 

を成功せず。

EDIT:

この問題は、私はここに尋ねたより具体的なDjangoの問題への解決策になることができます:

Django - is it possible to iterate over methods?

+0

技術的には、getattr(self、a).__ func __.__ code __。co_varnames'で 'statistic 'のようなことをして' statistic'というローカル変数を持つメソッドを見つけることができますが、機能の内部で使用されることも、これはすべて推奨されていません。 –

答えて

1

をあなたの例では、statisticはの属性ではありませんので、それは不可能ですあなたのメソッド - メソッドのスコープに限定された変数です。 事実上の属性の作成である

def want(self): 
    # Some code 
    return 

want.statistics = True 

、およびgetattr()が実際に働くだろうに。言い換えれば、あなたの例では、次のように相当ないです。

つまり、statisticsという名前の変数があるメソッドのリストを取得する方法はありません。あなたはおそらく欲しい

EDIT

はあなたのコードのいくつかの特定の部分に呼び出すメソッドのリストを定義することです。おそらく、これらのメソッドをモデルの定数で定義することができます。

class Model(models.Model): 
    name = ... 
    USEFUL_METHODS = ['want', 'want_too'] 

    def dont_want(self): 
     return 'foo' 

    def want(self): 
     statistic = True 
     return self.name 

    def want_too(self): 
     statistic = True 
     return self.name 

# ... 

instance = Model() 
for method_str in Model.USEFUL_METHODS: 
    method = getattr(instance, method_str) 
    method() 
+0

ありがとうございます。実際これは私がここに投稿したDjango固有の問題の解決策でした:http://stackoverflow.com/questions/41063566/django-is-it-possible-to-work-with-model-methods-in- a-for-loop/41063607?noredirect = 1#comment69335315_41063607 –

+0

私の更新された回答が役に立ちます。ありがとうございました – lucasnadalutti

+0

"統計情報という名前の変数があるメソッドのリストを取得する方法はありません。" [私のコメントを見る](http://stackoverflow.com/questions/41066104/how-to-iterate-over-and-filter-object-methods/41066507#comment69339910_41066104) –

0

それが実行(またはそれは、バイトコードです見て)だ時にあなたは、関数を実行し、検査することなく、関数のローカル変数を検査することはできませんが、メソッド自身で設定する属性を調べることができます。

私はあなたの定義とコードの前@statistics_method権利をかけることになり、あなたの現在の設定関数内

def statistics_method(func): 
    func.statistic = True 
    return func 
その後、

代わりのstatistic = Trueのロジックを模倣するために右の定義の後statistic属性を追加するデコレータをお勧めしますあなたは現在働いているでしょう。

関連する問題