如果不需要调用任何方法,这可以通过 Python 的多重继承来完成super()。
class Dog(object):
    name = "Spot"
class Cat(object):
    name = "Whiskers"
class SpeakingAnimalMixin(object):
    def speak(self):
        print "My name is", self.name, "and I can speak!"
class SpeakingDog(SpeakingAnimalMixin, Dog):
    pass
class SpeakingCat(SpeakingAnimalMixin, Cat):
    pass
SpeakingDog().speak()
  我的名字是 Spot,我会说话!
如果确实需要super()从方法调用,则需要动态创建类。这可以正常工作,但生成的类的名称将不太有用,并且 IDE 和其他静态分析工具可能不太有用。
您可以使用函数创建类,将超类作为参数传递:
def make_speaking_animal_class(SpeechlessAnimal):
    class SpeakingAnimal(SpeechlessAnimal):
        def get_name(self):
            return "Speaking " + super(SpeakingAnimal, self).get_name()
        def speak(self):
            print "My name is", self.get_name()
    return SpeakingAnimal
class Dog(object):
    def get_name(self):
        return "Spot"
class Cat(object):
    def get_name(self):
        return "Whiskers"
SpeakingDog = make_speaking_animal_class(Dog)
SpeakingCat = make_speaking_animal_class(Cat)
SpeakingCat().speak()
  我的名字是会说话的胡须
但是如前所述,该类的__name__属性可能不是您所期望的。
print SpeakingDog
print SpeakingDog()
<class '__main__.SpeakingAnimal'>
<__main__.SpeakingAnimal object at 0x1004a3b50>
您可以通过自己为它们分配唯一__name__属性来解决此问题:
SpeakingDog.__name__ = 'SpeakingDog'
print SpeakingDog
<class '__main__.SpeakingDog'>
(感谢Andrew Jaffe在答案中提出这个建议,但他删除了它。)
还有另一种动态创建类的方法,但我不鼓励你使用它,除非你需要;就更不清楚了。除了确定对象的类之外,该type函数还有第二个用途:它可用于动态创建新类。
以这种方式使用时,该type函数采用三个参数:
- name,- __name__新班级将有。
- bases,新类将继承的基类元组。
- dict,包含新类将具有的方法和属性的字典。
你可以像这样使用它:
def make_speaking_animal_class(SpeechlessAnimal, name):
    def get_name(self):
        return "Speaking " + super(SpeakingAnimal, self).get_name()
    def speak(self):
        print "My name is", self.get_name()
    bases = (SpeechlessAnimal,)
    # We need to define SpeakingAnimal in a variable so that get_name can refer
    # to it for the super() call, otherwise we could just return it directly.
    SpeakingAnimal = type(name, bases, {
        'get_name': get_name,
        'speak': speak
    })
    return SpeakingAnimal
class Dog(object):
    def get_name(self):
        return "Spot"
class Cat(object):
    def get_name(self):
        return "Whiskers"
SpeakingDog = make_speaking_animal_class(Dog, 'SpeakingDog')
SpeakingCat = make_speaking_animal_class(Cat, 'SpeakingCat')
SpeakingDog().speak()
SpeakingCat().speak()
  我的名字是Speaking Spot
  我的名字是Speaking Whiskers