list_like_object.py

#!/usr/bin/python3
# ====================================================================
# From: www.youtube.com/watch?v=Opp9AQ90FHw
# Title: Python tricks: Using magic (dunder) functions to
#        create list-like objects
# ====================================================================

class names:

    def __init__(self):
        self._names = [
            'alice',
            'beth',
            'charles',
            'dave',
            'edward',
            'fred',
            'gail',
            'helen',
            'ive',
            'judy',
            'tom' ]

    # ---- magic dunder function called by len()
    def __len__(self):
        return len(self._names)

    # ---- default function
    # ---- removes the item from the list
    def __getitem__(self,key):
        if isinstance(key,str):
            return self._names.pop(key)  # pop removes items from list
        raise TypeError(f'Can not get key {key}')

    # ---- called instead if __getitem__
    def __contains__(self,name):
        return name in self._names

    # ---- implemented with a generator function
    def __iter__(self):
        while self._names:
            yield self._names.pop()  # pop removes items from list

        

# --------------------------------------------------------------------
# ---- main
# --------------------------------------------------------------------

if __name__ == '__main__':

    mymob = names()

    # ---- example 1
    print()
    print(f'There are {len(mymob)} names in the mob')
    if 'tom' in mymob:
        print('tom is in mymob')
    else:
        print('tom is no in mymob')
    print(f'There are still {len(mymob)} names in the mob')

    # ---- example 2
    print()
    print(f'There are {len(mymob)} names in the mob')
    for name in mymob:
        print(name)
    print(f'There are {len(mymob)} names in the mob')