Is there any Python equivalent to partial classes?

前端 未结 9 1485
無奈伤痛
無奈伤痛 2020-11-27 15:31

Using \"new\" style classes (I\'m in python 3.2) is there a way to split a class over multiple files? I\'ve got a large class (which really should be a single class from an

相关标签:
9条回答
  • 2020-11-27 16:22

    I've previously toyed around with something similar. My usecase was a class hierarchy of nodes in an abstract syntax tree, and then I wanted to put all e.g. prettyprinting functions in a separate prettyprint.py file but still have them as methods in the classes.

    One thing I tried was to use a decorator that puts the decorated function as an attribute on a specified class. In my case this would mean that prettyprint.py contains lots of def prettyprint(self) all decorated with different @inclass(...)

    A problem with this is that one must make sure that the sub files are always imported, and that they depend on the main class, which makes for a circular dependency, which may be messy.

    def inclass(kls):
        """
        Decorator that adds the decorated function
        as a method in specified class
        """
        def _(func):
            setattr(kls,func.__name__, func)
            return func
        return _
    
    ## exampe usage
    class C:
        def __init__(self, d):
            self.d = d
    
    # this would be in a separate file.
    @inclass(C)
    def meth(self, a):
        """Some method"""
        print "attribute: %s - argument: %s" % (self.d, a)
    
    i = C(10)
    print i.meth.__doc__
    i.meth(20)
    
    0 讨论(0)
  • 2020-11-27 16:22

    I met the same situation - I want to slipt my class to 2 files. the reason is that - I want part 1 for GUI layout, only layout and another file keeps all function. like c#'s Partial class. one for XAML and another one for functions.

    0 讨论(0)
  • 2020-11-27 16:31

    First I'd like to say that something this complicated it probably not a good idea just to make finding your place in the class easier - it would be best to add comments, highlight sections etc. However, I see two ways you could do this:

    1. Write the class in several files, then read them in as text, concatenate them and exec the resulting string.

    2. Create a separate class in each file, then inherit them all into a master class as mixins. However, if you're subclassing another class already this could lead to MRO problems. You could get around this by creating a metaclass for your master class which manually resolves the MRO, but this could get messy.

    The easiest would be the first option.

    0 讨论(0)
提交回复
热议问题