Is it possible to do partial inheritance with Python?

后端 未结 4 1323
猫巷女王i
猫巷女王i 2020-12-15 05:34

I\'m creating a class (class0) in Python that is a currently based off of one class (class1); however, I\'d like to inherit from another class as well (class2). The thing ab

相关标签:
4条回答
  • 2020-12-15 06:00

    create another base class implementing this one method and make class2 and class1 both inherit this class

    0 讨论(0)
  • 2020-12-15 06:11

    The "mixin" method of having another class that just implemetns the method you want is the correct thing to do in this case. But for sake of completeness, as it answers exactly what you are asking, I add that yes, it is possible to have a behavior just like the "partial inheritance" you want (but note that such a concept does not exist formally).

    All one have to do is to add member on the new class that refer to to the method or attribute you wish to repeat there:

    class Class2(object):
       def method(self):
          print ("I am method at %s" % self.__class__)
    
    class Class1(object):
       pass
    
    class Class0(Class1):
       method = Class2.__dict__["method"]
    
    ob = Class0()
    ob.method()
    

    Note that retrieving the method from the class __dict__ is needed in Python 2.x (up to 2.7) - due to runtime transforms that are made to convert the function in a method. In Python 3.0 and above, just change the line

    method = Class2.__dict__["method"]
    

    to

    method = Class2.method
    
    0 讨论(0)
  • 2020-12-15 06:13

    Why don't you use composition instead? Have your class keep a reference to the desired object, and delegate to it.

    0 讨论(0)
  • 2020-12-15 06:22

    One path is to use the 'mixin' approach:

    class Mixin(object):
        def method(self):
            pass
    
    class C1(Mixin, ...parents...):
        pass
    
    class C2(Mixin, ...parents...):
        pass
    

    Another way is the composition:

    class C1(object):
        def method(self):
            pass
    
    class C2(object):
        def __init__(self):
            self.c1 = C1()
    
        def method(self):
            return self.c1.method()
    
    0 讨论(0)
提交回复
热议问题