2015-01-18 8 views
5

मिक्सिन कक्षाएं सार आधार कक्षाएं हैं? नीचे दिए गए उदाहरण में, test_base पर कॉल विफल हो जाएंगी क्योंकि पाइथन उदाहरण के लिए self.assertEqual को हल करने में सक्षम नहीं होगा।मिक्सिन कक्षाएं सार आधार कक्षाएं

इसके अलावा, क्या Pycharm को नीचे दिए गए जैसा मिक्सिन वर्गों को ध्वजांकित करने के रूप में गलत है, जिसमें अनसुलझे विशेषता त्रुटियां हैं?

class TestConverterMixin(object): 
    def setUp(self): 
     self.alt_hasher = getattr(hash, self.converter.__class__.__name__) 

    def test_base(self): 
     with self.settings(PASSWORD_HASHERS=[self.hasher, ]): 
      load_hashers(settings.PASSWORD_HASHERS) 

      for password in PASSWORDS: 
       orig = self.alt_hasher.encrypt(password) 
       conv = self.converter.from_orig(orig) 

       # see if we get a working hash: 
       self.assertTrue(check_password(password, conv)) 

       # convert back and test with passlib: 
       back = self.converter.to_orig(conv) 
       self.assertEqual(orig, back) 

उत्तर

5

मिक्सिन कक्षाएं सारबेसबेस क्लासेस हैं? आपके मामले का सबसे सटीक उत्तर नहीं है, लेकिन शायद यह होना चाहिए।

आपकी कक्षा स्टैंड-अलोन के रूप में आपके लिए इंगित नहीं की जा सकती है। यह एक ABC करके आप स्पष्ट रूप से किसी को भी कि

from abc import ABCMeta, abstractmethod 

class TestConverterMixin(object): 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def assertEqual(self, other): 
     "Need concrete implementation somewhere" 

    .... the rest of your code 

अपने वर्ग (pycharm की तरह) में दिख रही समस्या यह है कि आप अन्य विधियों (self.AssertTrue, self.converter आदि) के सभी के लिए यह आवश्यकता होगी है बताओ। आपके मन में कुछ और हो सकता है लेकिन यह गंभीरता से मुझे unittest.TestCase के उप-वर्ग की तरह दिखता है।

ओह और PyCharm गलत था। नहीं, उन्हें सही मिला। यदि आपने इसे एबीसी या टेस्टकेस का उप-वर्ग बनाया है, तो उन्होंने शिकायत नहीं की होगी। यदि आप इंटरफेस का इस्तेमाल करते हैं, जैसे ज़ोप.इंटरफेस, पिचर्म और जैसे आमतौर पर यह गलत हो जाता है क्योंकि वे पंजीकरण और लुकअप प्रक्रिया को समझ नहीं पाते हैं। (यह पायथन कोर के बाहर है)

+0

धन्यवाद - हाँ, मैं आम तौर पर एकजुट दिख रहा हूं, ऐसा लगता है कि कुछ मामलों में मिक्सिन बेहतर काम करता है, लेकिन शायद यूनिट का सबक्लास है। टेस्टकेस उतना ही अच्छा है। – smithy

0

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

class Human: 
    def is_male(self): 
     return True 

class BeardMixin: 
    _facial_hair = {'length': 7, 'color': 'brown'} 

    def has_beard(self): 
     return True 

class BeardLengthMixin: 
    """Mixin for class Human with BeardMixin to provide get_beard_length()""" 

    def get_beard_length(self): 
     assert isinstance(self, (Human, BeardMixin)) 
     # PyCharm will now not complain about any of these 3 attributes 
     if self.is_male() and self.has_beard(): 
      return self._facial_hair['length'] 

ज़ोर बयान PyCharm आवश्यक जानकारी जो प्रकार के बारे में स्वयं हो सकता है देता है: लेकिन तब मैं PyCharm 2017.1 खुश करने के लिए यह लगभग पूर्ण रास्ता मिल गया। यद्यपि एक कमी है: जोरदार कथन स्वयं ऐसा नहीं करता जो आपको लगता है: यह केवल जांचता है कि स्वयं किसी भी प्रकार का है, भले ही यह दोनों का हो। दुर्भाग्यवश, दो जोरदार बयानों का उपयोग करना काम नहीं करता है, क्योंकि दूसरे को पहले तक ओवरराइड किया जाता है जब तक कि चाइचर्म के प्रकार की कटौती का संबंध है।

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