Python中的mixin模式

MixIn和继承的关系

面向对象三大特征,继承、封装、多态。第一次看到MixIn的时候,弄不懂这个和继承有什么关系/区别。首先,继承是父亲和儿子的关系,而python minxin是混入的意思。虽然,MinIn子类可以使用,父类的方法,但这并不是一种继承的关系,而是父类为子类提供了一种可用的方法。

继承的诟病

子类、父类继承关系过多,会导致思维上的混乱,比如我们的父类派生出很多个子类,我们会一直考虑继承了XXX,如果父类没有这个方法,则子类再创造一个方法,那么子类这个方法多个地方用到,我们又得把它加入到父类才行,这样下来并不是很合适。

MixIn

MixIn的方式则没有那么得拘束,例如有个Persion类

class Person():
    pass

这个人需要修电脑,但是我不会修怎么办。那我写个修电脑的方法给他,那显然不合适。那怎么办,刚好这个人有个朋友,过来帮帮忙吧。

class FriendMixIn():
    def repair_compute:
        return True

class Person(FriendMixIn):
    pass

那么很快就明白,MixIn相当于在原来的基础上,锦上添花。他是包含的意思,而不是继承的关系。

在Python中到处可以看到MixIn的应用。

例如Django的,DetailView视图函数。

class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView):
    """
    Render a "detail" view of an object.

    By default this is a model instance looked up from `self.queryset`, but the
    view will support display of *any* object by overriding `self.get_object()`.
    """

可以看到DetailView什么也没有干,它首先继承了BaseDetailView,它只是提供了视图的方法,但是模板从哪里来呢?那么使用SingleObjectTemplateResponseMixin来获取模板。可以看得出DetailViewSingleObjectTemplateResponseMixin并没有继承的关系。

转载注明,本文链接:http://www.bianbingdang.com/article_detail/167.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonMixin是一种编程技术,用于通过多重继承来增强的功能。Mixin是一个包含一些方法和属性的,这些方法和属性可以被其他继承和使用。 Mixin通常不会被单独实例化,而是作为其他的一个父类,通过多重继承将其功能混入到子。子可以同时继承多个Mixin,从而获取它们提供的功能。 Mixin的主要目的是为了实现代码的重用和模块化,通过将通用的功能抽象到Mixin,可以使代码更加清晰、可维护和可扩展。 一个简单的例子是,假设我们有一个基础的Animal,然后我们定义了一些Mixin,如FlyMixin、SwimMixin和RunMixin,它们分别提供了飞行、游泳和奔跑的功能。然后我们可以定义一些具体的动物,如Bird、Fish和Horse,通过多重继承将对应的Mixin混入到这些动物,从而使它们具备相应的功能。 ```python class Animal: def __init__(self, name): self.name = name class FlyMixin: def fly(self): print(f"{self.name} is flying!") class SwimMixin: def swim(self): print(f"{self.name} is swimming!") class RunMixin: def run(self): print(f"{self.name} is running!") class Bird(Animal, FlyMixin): pass class Fish(Animal, SwimMixin): pass class Horse(Animal, RunMixin): pass bird = Bird("Sparrow") bird.fly() # 输出:Sparrow is flying! fish = Fish("Salmon") fish.swim() # 输出:Salmon is swimming! horse = Horse("Mustang") horse.run() # 输出:Mustang is running! ``` 在上述代码,我们定义了Animal作为基础,然后定义了FlyMixin、SwimMixin和RunMixin作为Mixin。最后,我们定义了Bird、Fish和Horse作为具体的动物,并通过多重继承将对应的Mixin混入到这些。 通过使用Mixin,我们可以灵活地组合和复用功能,从而使的设计更加灵活和可扩展。同时,Mixin的使用也可以避免多重继承带来的一些问题,如菱形继承问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值