2009-10-28 10 views
5

को देखते हुए के साथ निम्न उदाहरण है। तो मैं निम्नलिखित बातें क्या करना चाहते हैं:अजगर कक्षा पूर्णांक अनुकरण

f=Foo(3) 
print int(f)+5 # is working 
print f+5 # TypeError: unsupported operand type(s) for +: 'Foo' and 'int' 

पहले बयान print int(f)+5 काम कर रहा है, कारण वहाँ दो पूर्णांक हैं। दूसरा एक असफल रहा है, क्योंकि मुझे अपनी कक्षा के साथ इस ऑपरेशन को करने के लिए __add__ लागू करना है।

तो पूर्णांक व्यवहार को लागू करने के लिए, मुझे सभी पूर्णांक अनुकरण विधियों को लागू करना होगा। मैं इसके आसपास कैसे हो सकता है। मैंने int से उत्तराधिकारी की कोशिश की, लेकिन यह प्रयास सफल नहीं हुआ।

अद्यतन

int से विरासत में विफल रहता है, तो आप उपयोग करना चाहते हैं एक __init__:

class Foo(int): 
    def __init__(self, some_argument=None, value=0): 
     self.value=value 
     # do some stuff 

    def __int__(self): 
     return int(self.value) 

यदि आप तो कहते हैं:

f=Foo(some_argument=3) 

आपको मिलेगा:

अजगर 2.5 के साथ परीक्षण किया गया और 2.6

+1

मुझे आपका प्रश्न समझ में नहीं आता है। एक चीज न करने के लिए आपको एक चीज के आसपास कैसे मिलना है जो आपको करना है? Fishslap! –

+0

मैं एक पूर्णांक की तरह कक्षा कार्य करना चाहता हूं। वास्तविक पूर्णांक के लिए कार्यान्वयन हमेशा समान होता है, इसलिए हर बार जब आप इसका उपयोग करते हैं तो इसे लागू क्यों करें। __add__ विधि तब समझ में आता है जब आप वास्तविक जोड़ के अलावा अन्य सभी चीज़ों के लिए '+' - ऑपरेटर का उपयोग करते हैं। –

उत्तर

5

आप __new__, नहीं __init__ ओवरराइड करने के लिए की जरूरत है:

class Foo(int): 
    def __new__(cls, some_argument=None, value=0): 
     i = int.__new__(cls, value) 
     i._some_argument = some_argument 
     return i 

    def print_some_argument(self): 
     print self._some_argument 

अब अपनी कक्षा काम के रूप में उम्मीद:

>>> f = Foo(some_argument="I am a customized int", value=10) 
>>> f 
10 
>>> f + 8 
18 
>>> f * 0.25 
2.5 
>>> f.print_some_argument() 
I am a customized int 

अधिक new अधिभावी के बारे में जानकारी Unifying types and classes in Python 2.2 में पाया जा सकता।

7

अजगर में 2.4+ पूर्णांक से इनहेरिट काम करता है: अजगर का एक अप-टू-डेट संस्करण का उपयोग करने

class MyInt(int):pass 
f=MyInt(3) 
assert f + 5 == 8 
+0

मुझे समस्याएं थीं जब मैं निर्माता (__init__) के लिए नामांकित तर्कों का उपयोग कर रहा था। जब मैं f = MyInt (other_argument = True) को कॉल करता हूं तो यह विफल रहा था (TypeError: 'other_argument' इस फ़ंक्शन के लिए एक अवैध कीवर्ड तर्क है) –

+1

@ गुंटर जेले: कृपया इसे अपने प्रश्न में जोड़ें। यह टिप्पणी आपके प्रश्न के साथ वर्ग नहीं है, और इस प्रश्न के संदर्भ में बहुत अधिक समझ नहीं लेती है। कृपया सभी तथ्यों को शामिल करने के लिए प्रश्न अपडेट करें। –

+0

int –

2

प्रयास करें। आपका कोड 2.6.1 में काम करता है।

+0

से विरासत का परिणाम जोड़ा गया है, मैं इसे –

+0

का प्रयास करूंगा, मेरा पायथन संस्करण वर्तमान में 2.5.1 –

+0

प्रतीक्षा करें, आप 'ऑब्जेक्ट' से विरासत क्यों प्राप्त कर रहे हैं ?? यदि कोड 'int' से प्राप्त होता है तो कोड काम करता है। – jdb

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