What is the correct (or best) way to subclass the Python set class, adding a new instance variable?

前端 未结 7 1032
囚心锁ツ
囚心锁ツ 2021-01-01 20:45

I\'m implementing an object that is almost identical to a set, but requires an extra instance variable, so I am subclassing the built-in set object. What is the best way to

7条回答
  •  不知归路
    2021-01-01 20:56

    My favorite way to wrap methods of a built-in collection:

    class Fooset(set):
        def __init__(self, s=(), foo=None):
            super(Fooset,self).__init__(s)
            if foo is None and hasattr(s, 'foo'):
                foo = s.foo
            self.foo = foo
    
    
    
        @classmethod
        def _wrap_methods(cls, names):
            def wrap_method_closure(name):
                def inner(self, *args):
                    result = getattr(super(cls, self), name)(*args)
                    if isinstance(result, set) and not hasattr(result, 'foo'):
                        result = cls(result, foo=self.foo)
                    return result
                inner.fn_name = name
                setattr(cls, name, inner)
            for name in names:
                wrap_method_closure(name)
    
    Fooset._wrap_methods(['__ror__', 'difference_update', '__isub__', 
        'symmetric_difference', '__rsub__', '__and__', '__rand__', 'intersection',
        'difference', '__iand__', 'union', '__ixor__', 
        'symmetric_difference_update', '__or__', 'copy', '__rxor__',
        'intersection_update', '__xor__', '__ior__', '__sub__',
    ])
    

    Essentially the same thing you're doing in your own answer, but with fewer loc. It's also easy to put in a metaclass if you want to do the same thing with lists and dicts as well.

提交回复
热议问题