मेरे पास एक वर्ग है, जिसमें प्रारंभिकरण और सफाई तर्क है:

class Bird(object):
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print("enter " + self.name)
        return self

    def __exit__(self, type, value, traceback):
        print("exit " + self.name)

मैं इसे संदर्भ प्रबंधक के साथ उपयोग करता हूं:

with Bird("chicken") as b:
    print(b)

लेकिन अब मैं एक ही व्यवहार के साथ अपनी वस्तुओं की सूची का उपयोग करना चाहता हूं, यानी सूची के साथ काम करने के बाद, इसकी वस्तुओं का निपटान किया जाना चाहिए:

with DisposableList([Bird("A"), Bird("B")]) as list:
    #some ops

मैं सूची या शायद कोई अन्य समाधान कैसे कार्यान्वित कर सकता हूं?

3
zella 3 अप्रैल 2018, 18:08

2 जवाब

इसके चारों ओर एक लूप लपेटें:

for bi in ['hawk','chicken','eagle']:
    with Bird(bi) as b:
        print(b)

या, शायद बेहतर अभी भी, एक बर्ड ऑब्जेक्ट के प्रत्येक उदाहरण पर बारी-बारी से जनरेटर का उपयोग करें:

def bird_gen(li):
    for bird in li:
        with Bird(bird) as b:
            yield b

for b in bird_gen(['hawk','chicken','eagle']):
    print(b)
2
dawg 3 अप्रैल 2018, 15:51

यदि आपको कक्षा की आवश्यकता नहीं है

from contextlib import contextmanager
@contextmanager
def bird(lst):
    print 'enter {}'.format(lst)
    yield lst
    print 'exit {}'.format(lst)


with bird([1,2,3,4]) as f:
    print f


enter [1, 2, 3, 4]
[1, 2, 3, 4]
exit [1, 2, 3, 4]
4
galaxyan 3 अप्रैल 2018, 15:22