2010-02-10 33 views
12

मैं डेकोरेटर @login_testuser विधि test_1 के खिलाफ आवेदन किया है में तरीकों को अजगर सज्जाकार आवेदन:एक वर्ग

class TestCase(object): 
    @login_testuser 
    def test_1(self): 
     print "test_1()" 

वहाँ एक रास्ता मैं कक्षा "test_" उपसर्ग के साथ की हर विधि पर @login_testuser आवेदन कर सकते हैं है?

दूसरे शब्दों में, डेकोरेटर, test_1 पर लागू होगा नीचे test_2 तरीकों, लेकिन सेटअप पर नहीं।

class TestCase(object): 
    def setUp(self): 
     pass 

    def test_1(self): 
     print "test_1()" 

    def test_2(self): 
     print "test_2()" 

उत्तर

18

पायथन 2.6 में, class decorator निश्चित रूप से जाने का तरीका है। जैसे, यहाँ कार्यों के इन प्रकार के लिए एक बहुत सामान्य से एक है:

import inspect 

def decallmethods(decorator, prefix='test_'): 
    def dectheclass(cls): 
    for name, m in inspect.getmembers(cls, inspect.ismethod): 
     if name.startswith(prefix): 
     setattr(cls, name, decorator(m)) 
    return cls 
    return dectheclass 

और अब, बस

@decallmethods(login_testuser) 
class TestCase(object): 
    def setUp(self): 
     pass 

    def test_1(self): 
     print "test_1()" 

    def test_2(self): 
     print "test_2()" 

आप क्या चाहते हैं आप मिल जाएगा। अजगर 2.5 या बुरा में, @decallmethods वाक्य रचना वर्ग सजावट के लिए काम नहीं करता है, लेकिन अन्यथा ठीक उसी कोड के साथ आप सही class TestCase बयान के अंत के बाद निम्न कथन से यह जगह ले सकता है:

TestCase = decallmethods(login_testuser)(TestCase) 
3

ज़रूर। कक्षा के सभी गुणों को दोहराएं। एक विधि होने के लिए प्रत्येक को जांचें और यदि नाम "test_" से शुरू होता है।

from inspect import ismethod, getmembers 
for name, obj in getmembers(TestCase, ismethod): 
    if name.startswith("test_"): 
     setattr(TestCase, name, login_testuser(obj)) 
+3

मैं इसे कक्षा-सजावटी में भी रखा जाएगा। – Wim

0

हाँ, आप कर सकते हैं अधिक पाश वर्ग के dir/__dict__ या एक metaclass कि ऐसा नहीं करता है, अगर विशेषताओं के साथ शुरू की पहचान है ": फिर समारोह अपने डेकोरेटर से लौटे

कुछ तरह से बदलने परीक्षा"। हालांकि, यह सजावटी को स्पष्ट रूप से लिखने से कम सरल, स्पष्ट कोड बनाएगा।

3

क्या आप वाकई login_testuser के कोड को setUp में डालकर बेहतर नहीं होंगे? यही सेटअप के लिए है: यह प्रत्येक परीक्षण विधि से पहले चलाया जाता है।

+0

सुझाव के लिए धन्यवाद, लेकिन मैं सजावटी को केवल एक विशेष उपसर्ग के साथ विधियों पर लागू करना चाहता हूं, और सेटअप सभी विधियों पर लागू होगा। –

+2

शायद उन विधियों को अपनी कक्षा में अलग कर दें? जादू निरीक्षण और तरीकों का संवर्धन एक रहस्यमय रखरखाव सिरदर्द की तरह लगता है। –

संबंधित मुद्दे