2011-12-25 19 views
10

मैं एक मॉड्यूल मैं विस्तार कर रहा हूँ से कुछ कोड को साफ किया गया है और मैं इस कोड Pythonify के लिए एक रास्ता खोजने के लिए प्रतीत नहीं कर सकते हैं:कक्षा के उदाहरणों की गणना?

global_next_id = 1 

class Obj: 
    def __init__(self): 
    global global_next_id 
    self.id = global_next_id 

    global_next_id += 1 

इस कोड को एक वैश्विक आईडी का उपयोग करता उदाहरणों का ट्रैक रखने के एक वर्ग के (मुझे वैरिएबल self.id आंतरिक रूप से भी चाहिए, और इसे एक संख्या होने की आवश्यकता है)।

क्या कोई इस कोड को पाइथोनिफ़ाई करने का कोई तरीका सुझा सकता है?

+1

क्यों आप एक वैश्विक आईडी के साथ "एक वर्ग के उदाहरण का ट्रैक रखने" की जरूरत है? –

+1

यह एक पीडीएफ लाइब्रेरी के लिए है जिसे मैं संशोधित कर रहा हूं। प्रत्येक पीडीएफ 'ओबीजे' को अपने संबंधित आईडी के साथ मुद्रित करने की आवश्यकता है। – Blender

उत्तर

34

इस तरह की कोशिश कुछ:

from itertools import count 

class Obj(object): 
    _ids = count(0) 

    def __init__(self): 
    self.id = next(self._ids) 
+1

मैंने पूरी तरह से कक्षा-व्यापी चर को अनदेखा किया ... 'itertools' समाधान के लिए धन्यवाद! – Blender

+1

मेरी इच्छा है कि मैं एकमात्र क्रेडिट का दावा कर सकता हूं - मैंने इसे किसी अन्य पोस्ट पर कहीं कहीं देखा था। यह सुरुचिपूर्ण और कुशल है। –

+0

एह, यह मेरे लिए काम करता है। – Blender

1

जेनरेटर?

def get_next_id(): 
    curr_id = 1 
    while True: 
     yield curr_id 
     curr_id += 1 
3

यहां एक ही आईडी/गिनती साझा करने वाले वंशज वर्गों के बिना उदाहरणों की गणना करने का एक तरीका है। प्रत्येक वर्ग के लिए एक अलग आईडी काउंटर बनाने के लिए एक मेटाक्लास का उपयोग किया जाता है।

मेटाक्लास के लिए पायथन 3 वाक्यविन्यास का उपयोग करता है।

import itertools 

class InstanceCounterMeta(type): 
    """ Metaclass to make instance counter not share count with descendants 
    """ 
    def __init__(cls, name, bases, attrs): 
     super().__init__(name, bases, attrs) 
     cls._ids = itertools.count(1) 

class InstanceCounter(object, metaclass=InstanceCounterMeta): 
    """ Mixin to add automatic ID generation 
    """ 
    def __init__(self): 
     self.id = next(self.__class__._ids) 
0

यह काम करना चाहिए:

class Obj: 
    _counter = 0 
    def __init__(self): 
     Obj._counter += 1 
     self.id = Obj._counter 
संबंधित मुद्दे