2010-10-14 3 views
6

मेरे पास एक विधि है एक विधि के साथ कक्षा वर्ग है। तब मेरे पास एक विधि बार() है जो एक Foo ऑब्जेक्ट प्राप्त करता है और जिसका व्यवहार इस पर निर्भर करता है कि यह मान्य है या नहीं।सबसे सामान्य पायथन प्रकार क्या है जिसमें मैं गुण जोड़ सकता हूं?

इसका परीक्षण करने के लिए, मैं कुछ ऑब्जेक्ट को बार में पास करना चाहता था जिसका वैध तरीका हमेशा गलत होता है। अन्य कारणों से, मैं परीक्षण के समय Foo का ऑब्जेक्ट नहीं बना सकता, इसलिए मुझे इसे ऑब्जेक्ट की नकली करने की आवश्यकता थी। जो मैंने पहली बार सोचा था वह सबसे सामान्य वस्तु बना रहा था और इसे जोड़ने के लिए विशेषता को जोड़ना है, इसे फू के रूप में उपयोग करने के लिए। लेकिन उस काफी काम नहीं किया:

>>> foo = object() 
>>> foo.isValid = lambda : False 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'isValid' 

मैं वस्तु को पता चला एक __dict__ नहीं है, तो आप इसे करने के लिए गुण नहीं जोड़ सकते। इस बिंदु पर, वैकल्पिक हल मैं उपयोग कर रहा हूँ इस उद्देश्य के लिए तुरंत एक प्रकार पैदा कर रही है और फिर उस प्रकार का ऑब्जेक्ट बनाने:

>>> tmptype = type('tmptype',(), {'isValid' : lambda self : False}) 
>>> x = tmptype() 
>>> x.isValid() 
False 

लेकिन यह भी एक शॉट लंबा लगता है। कुछ आसानी से उपलब्ध सामान्य प्रकार होना चाहिए जो मैं इस उद्देश्य के लिए उपयोग कर सकता हूं, लेकिन कौन सा?

उत्तर

4

बस इतना है कि सही जवाब कहा गया है और लोगों को सभी टिप्पणियों को पढ़ने के लिए नहीं है: ऐसा कोई प्रकार है। यह प्रस्तावित, चर्चा की गई है, और विचार को खारिज कर दिया गया है। यहां एक लिंक है जो एक टिप्पणी पर पोस्ट किया गया है, जहां अधिक पढ़ा जा सकता है: http://mail.python.org/pipermail/python-bugs-list/2007-January/036866.html

6

आपके पास सही विचार है लेकिन आप इसे अधिक सामान्य बना सकते हैं। या तो

tmptype = type('tmptype', (object,) {}) 

या

class tmptype(object): 
    pass 

तो फिर तुम सिर्फ

foo = tmptype() 
foo.is_valid = lambda: False 

की तरह आप object साथ करना चाहता था कर सकते हैं। इस तरह, आप अपनी सभी गतिशील, भद्दा-पैचिंग आवश्यकताओं के लिए एक ही कक्षा का उपयोग कर सकते हैं।

+0

ठीक है, यह मूल रूप से वही चीज़ है जो इसके बजाय और अधिक नई शैली कक्षा में फैली हुई है। लेकिन मेरा सवाल अभी भी जारी है: क्या एक ही उद्देश्य प्राप्त करने के लिए कुछ सामान्य आसानी से उपलब्ध प्रकार नहीं है? __dict__ के साथ ऑब्जेक्ट की तरह कुछ? क्या मुझे वास्तव में इसके लिए एक प्रकार बनाने की ज़रूरत है? – ricab

+0

@ricab: इस विचार को अस्वीकार कर दिया गया है कि मैंने अभी Google को खींचा है। आप दूसरों को ढूंढने में सक्षम हो सकते हैं। http://mail.python.org/pipermail/python-bugs-list/2007- जनवरी 0636866.html – aaronasterling

+0

ओह, ठीक है, तो ऐसा कोई प्रकार नहीं है। हालांकि मैं शायद इसे अभी याद कर रहा था ... धन्यवाद – ricab

1

आपको इसे जटिल बनाना क्यों है? मुझे लगता है कि सबसे आसान तरीका है (और 'मानक' जिस तरह से) के अलावा

class FakeFoo(object): 
    def is_valid(): 
     return False 

करना है, लैम्ब्डा के उपयोग इस संदर्भ में अच्छा नहीं है ... इस पर एक नज़र डालें: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html कर रहा है BDFL

और इतने पर ...

+0

क्योंकि मैं पाठकों को अतिरिक्त कक्षाओं के साथ विचलित नहीं करना चाहता हूं जिनके उपयोगों ने उन्हें दबदबा दिया हो और जिसके लिए उन्हें देखना पड़ सकता है।इसके अलावा, क्योंकि इस प्रकार की परिभाषा एकमात्र जगह पर है, इसकी एकमात्र वस्तु बनाई गई है, एक ही उद्देश्य के लिए आप तुरंत पा सकते हैं। परिभाषा वह जगह है जहां इसका उपयोग किया जाता है, जो परीक्षण को आत्मनिर्भर होने की अनुमति देता है। जब आप ऑब्जेक्ट देखते हैं, तो आप टाइप परिभाषा देखते हैं, और जब आप टाइप परिभाषा देखते हैं, तो आप इसका एकमात्र उद्देश्य जानते हैं। ऑब्जेक्ट और प्रकार दोनों का उद्देश्य कहीं और देखने के बिना स्पष्ट है। – ricab

+0

वैसे, मैं लेख पढ़ता हूं और मुझे समझ में नहीं आता कि यह कैसे पालन करता है कि लैम्बडा का उपयोग संदर्भ में अच्छा नहीं है ... – ricab

+0

मुझे पता है कि यह एक ही उद्देश्य के लिए है और इसी तरह ... लेकिन यह नहीं है ऐसा करने का सही तरीका, मेरी राय में ... मैं कोशिश कर सकता हूं: a.next() StopIterationError को छोड़कर: x में एक के लिए पूर्णांक पास करें: #पास लेकिन यह सही तरीका नहीं है ... मुझे कुछ मामले में पता है आप इसका इस्तेमाल कर सकते हैं, लेकिन आपको ऐसा क्यों करना चाहिए? मेरी राय में, मैं कहता हूं ... लेख लैम्ब्डा के उपयोग के बारे में था, और यह लिखा गया है कि लैम्ब्डा को सामान्य 'डीफ' के स्थान पर उपयोग नहीं किया जाना चाहिए, लेकिन केवल जब पायथन को अभिव्यक्ति की आवश्यकता होती है, न कि एक कथन। ..so, आप यह कर सकते हैं, लेकिन मैं पतली नहीं है यह समस्या पर सही दृष्टिकोण है ... – Ant

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