2016-08-30 12 views
5

मैं एक वर्ग है कि कुछ सरल डेटा हेरफेर करता है, मैं तीन तरीकों की जरूरत है: सेट, जोड़ने के लिए, उप:क्या मैं एक पाइथन क्लास के विधि नाम के रूप में एक बिल्टिन नाम का उपयोग कर सकता हूं?

class Entry(): # over-simplified but should be enough for the question 
    def __init__(self, value): 
     self.set(value) 
    def set(self, value): 
     self.value=value 
    def add(self, value): 
     self.value += value 
    def sub(self, value): 
     self.value -= value 

समस्या "सेट" विधि के साथ है, लेकिन एक वर्ग पद्धति के रूप में परिभाषित करने संघर्ष नहीं करना चाहिए "सेट()" बिल्टिन फ़ंक्शन के साथ।

Python Style Guide बताता है कि कार्यों और विधियों के तर्क नामों को अंतर्निहित कार्यों को छाया नहीं करना चाहिए, लेकिन यह विधि नामों के मामले में है?

स्पष्ट रूप से मैं एक और विधि नाम चुन सकता हूं, लेकिन प्रश्न अधिक सामान्य और अन्य संभावित विधि नामों (यानी फ़िल्टर, योग, इनपुट) के लिए मान्य है।

+0

नहीं करना चाहिए वास्तव में एक समस्या हो, क्योंकि पाइथन में विधि नाम हमेशा योग्यता प्राप्त करते हैं। – khelwood

उत्तर

2

builtin नाम पीछा नहीं के बारे में पूरी बात यह है कि आप उन्हें का उपयोग करें ताकि जब आपके कोड से करता है सक्षम किया जा रहा से अपने आप को रोकने के लिए नहीं करना चाहती:

x.set(a) #set the value to a 
b = set((1,2,3)) #create a set 

आप अभी भी अंतर्निहित उपयोग कर सकते हैं set तो कोई विरोधाभास नहीं होगा, समस्या सिर्फ अगर तुम वर्ग परिभाषा

class Entry(): 
    def __init__(self, value): 
     self.set(value) 
    def set(self, value): 
     self.value=value 
    possible_values = set((1,2,3,4,5)) #TypeError: set() missing 1 required positional argument: 'value' 

वर्ग परिभाषा के अंदर अंदर setउपयोग करना चाहता था है - और वहाँ केवल - है ख नाम पर छाया डालें, इसलिए आपको यह विचार करना होगा कि आप किसके लिए व्यवस्थित होंगे: असंभव परिदृश्य जहां आप कक्षा परिभाषा के अंदर set का उपयोग करने का प्रयास करते हैं और त्रुटि प्राप्त करते हैं या अपनी विधि के लिए एक गैर-सहज नाम का उपयोग करते हैं।

यह भी ध्यान रखें कि यदि आप विधि के नाम यह आपको समझ बनाने के लिए और भी अपने वर्ग परिभाषा set उपयोग करना चाहते हैं तो आप अभी भी अजगर के लिए अजगर 3 या __builtin__.set के लिए builtins.set के साथ उपयोग कर सकते हैं का उपयोग कर की तरह 2.

1

आप ठीक हैं। यदि आप एक अंतर्निहित विधि __init____iter__ आदि हैं, तो आप अंतर्निहित विधियों को ओवरराइट नहीं करना चाहते हैं, जब तक कि आप उन तरीकों से अपेक्षित कार्यक्षमता को लागू नहीं कर रहे हैं।

आप क्लास विधि के रूप में फ़ंक्शन में निर्मित "ओवरराइटिंग" कर रहे हैं, जिसका अर्थ है कि आप वास्तव में कुछ भी ओवरराइट नहीं कर रहे हैं। यह स्वीकार्य है।

+0

"यदि वे एक अंतर्निहित विधि हैं" मुझे भ्रमित करता है, मुझे लगता है कि शब्दावली यह है कि '__init__' और' __iter__' आदि ** जादू विधियां ** हैं (जिनमें उन्हें कुछ परिदृश्यों में स्पष्ट रूप से कहा जाता है) –

+0

जो सत्य है । हालांकि, कुछ लोग उन्हें जादू विधियों को फोन करना पसंद नहीं करते क्योंकि वे जादुई नहीं हैं, एकेए आप उन्हें ओवरराइट कर सकते हैं या उन्हें अपनी कक्षाओं में बना सकते हैं और जब आप उन्हें लिखते हैं तो वे काम करेंगे। इसलिए, यदि आप किसी ऑब्जेक्ट को '__iter__' विधि के साथ बनाते हैं तो इसे पायथन द्वारा * * इटेरिएबल * माना जाता है और इसे कहीं भी इस्तेमाल किया जा सकता है। – bravosierra99

+0

@ TadhgMcDonald-Jensen मैं डंडर विधियों को कह सकता था और यह स्पष्ट हो सकता है। मैं शब्दावली का उपयोग करने की कोशिश कर रहा था जो प्रश्न के अनुरूप है। शायद यह सबसे अच्छा निर्णय नहीं हो सकता है। – bravosierra99

1

Namespaces are one honking great idea - इस मामले में, नाम set परिभाषित किया गया है लेकिन यह केवल Entry वर्ग तक सीमित नामस्थान में मौजूद है और अंतर्निहित फ़ंक्शन नाम से संघर्ष नहीं करता है।

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

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