2009-04-11 14 views
14

में किसी वर्ग एक वर्ग को देखते हुए के उदाहरण है कि अपने वस्तुओं की एक रजिस्ट्री रखता है: (व्यक्ति का उपयोग किए बिना .__ रजिस्ट्री)पुनरावृत्ति वस्तु पर पायथन

class Person(object): 
    __registry = [] 

    def __init__(self, name): 
     self.__registry.append(self) 
     self.name = name 

मैं निम्नलिखित कोड काम कैसे होगा:

for personobject in Person: 
    print personobject 

शोध करते समय मुझे एक संकेत मिला कि -method के साथ __metaclass__ के लिए कोई भी जा सकता है। कोई विचार यह कैसा दिखता है?

+0

एह एक बदसूरत हैक देखो सुंदर नहीं बनाते हैं। –

उत्तर

20

आप अपनी कक्षा वस्तु को सरल मेटाक्लास के साथ पुन: प्रयोज्य बना सकते हैं।

class IterRegistry(type): 
    def __iter__(cls): 
     return iter(cls._registry) 

class Person(object): 
    __metaclass__ = IterRegistry 
    _registry = [] 

    def __init__(self, name): 
     self._registry.append(self) 
     self.name = name 

(मैं भी __registry_registry लिए यह आसान metaclass से उपयोग करने के लिए बनाने के लिए बदल दिया है)। फिर,

>>> p = Person('John') 
>>> p2 = Person('Mary') 
>>> for personobject in Person: 
...  print personobject 
... 
<person.Person object at 0x70410> 
<person.Person object at 0x70250> 
+0

आपको बहुत धन्यवाद ... वह वही था जो मैं ढूंढ रहा था;) – Titusz

+0

वास्तव में अच्छी युक्ति: मुझे यह नहीं पता था :) – jkp

+0

यह व्यक्ति वर्ग वर्ग में def __iter__ डालने के साथ क्यों काम नहीं करता है? बस सोच रहा। –

2

उसे अपने साथ कर सकते हैं:

for item in Person.__registry: 
    print(item) 
+0

यह स्पष्ट है ... लेकिन मैं इसे काम करना चाहता हूं: वर्गनाम में आइटम के लिए ... (बस इसकी सुंदरता के लिए ...) – Titusz

+0

आपको अपनी कक्षा को फिर से बनाने की ज़रूरत है, मुझे लगता है कि – SilentGhost

+0

और यह नहीं है सुंदर बीटीडब्ल्यू, – SilentGhost

10

पहले, डबल __ नाम का उपयोग नहीं करते। वे पायथन द्वारा उपयोग के लिए आरक्षित हैं। यदि आप "निजी" एकल _ का उपयोग करना चाहते हैं।

दूसरा, इस तरह की चीज़ को यथासंभव सरल रखें। कुछ जटिल पर बहुत समय और ऊर्जा बर्बाद मत करो। यह एक साधारण समस्या है, काम को पाने के लिए जितना संभव हो सके कोड को रखें।

class Person(object): 
    _registry = [] 

    def __init__(self, name): 
     self._registry.append(self) 
     self.name = name 

for p in Person._registry: 
    print p 
+0

बिंदु यह है कि _registry समाधान * ऐसा करने का सबसे आसान तरीका है। कुछ और बस "एक सुअर पर लिपस्टिक डालने" की कोशिश कर रहा है। –

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