Duck typing and class methods (or, how to use a method from both a class and an instance?)

后端 未结 3 1337
后悔当初
后悔当初 2021-01-07 05:47

I have some code which I would like to pass instances or classes interchangeably. All I will do in that code is to call a method that I expect both classes and instances to

3条回答
  •  醉话见心
    2021-01-07 06:29

    Consider reusing the classinstancemethod decorator from formencode.

    https://bitbucket.org/formencode/official-formencode/src/06d52c5b33c9/formencode/declarative.py

    class classinstancemethod(object):
        """
        Acts like a class method when called from a class, like an
        instance method when called by an instance.  The method should
        take two arguments, 'self' and 'cls'; one of these will be None
        depending on how the method was called.
        """
    
        def __init__(self, func):
            self.func = func
    
        def __get__(self, obj, type=None):
            return _methodwrapper(self.func, obj=obj, type=type)
    
    
    class _methodwrapper(object):
    
        def __init__(self, func, obj, type):
            self.func = func
            self.obj = obj
            self.type = type
    
        def __call__(self, *args, **kw):
            assert 'self' not in kw and 'cls' not in kw, (
                "You cannot use 'self' or 'cls' arguments to a "
                "classinstancemethod")
            return self.func(*((self.obj, self.type) + args), **kw)
    
        def __repr__(self):
            if self.obj is None:
                return (''
                        % (self.type.__name__, self.func.func_name))
            else:
                return (''
                        % (self.type.__name__, self.func.func_name, self.obj))
    

提交回复
热议问题