我在Python类( classa )中包装了一些功能。 classa从另一个类继承supera

我想要与classa完全相同的功能,除了我想从superb继承。

我可能只是该类复制classa新的一类classb ,然后更改超classb ,但显然这很俗气,维护头痛,我敢肯定有更好的办法-谁能告诉我它是什么?


编辑 :到目前为止,感谢您的答案。 我应该说,最初的我classa ,以调用调用超在其方法supera方法。 在将mixins作为选项时,这似乎具有一定的意义。

===============>>#1 票数:4

如果没有方法需要调用super()则可以使用Python的多重继承来完成。

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()

我叫口语
我的名字叫胡须

  ask by glaucon translate from so

未解决问题?本站智能推荐: