资讯专栏INFORMATION COLUMN

REST API设计理念与 Python Mixin模式

waruqi / 325人阅读

摘要:飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取语言可没有接口功能,但是它可以多重继承。说是,因为从语法上看,的确是通过多重继承实现的。所以从含义上理解,只是一个,不是一个。比如飞机照样可以载客,就是不能飞了

REST API设计理念




Python Mixin模式

背景

民航飞机和直升机都是飞行器,又是交通工具,轿车也是交通工具,但是不会飞
可以多重继承,但这违背了继承必须是”is-a”关系

不同语言的实现方法

java

Java提供了接口interface功能,来实现多重继承

public adstract class Vehicle {
}
public interface Flyable {
    public void fly();
}
public class FlyableImpl implements Flyable {
    public void fly() {
        System.out.printIn("I am flying");
    }
}

public class Airplane extends Vehicle implements Flyable {
    private flyable;
    public Airplane() {
        flyable = new FlyableImpl();
    }
    public void fly() {
        flyable.fly();
    }
}

现在我们的飞机同时具有了交通工具及飞行器两种属性,而且我们不需要重写飞行器中的飞行方法,同时我们没有破坏单一继承的原则。飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取

Python

Python语言可没有接口功能,但是它可以多重继承。那Python是不是就该用多重继承来实现呢?是,也不是。说是,因为从语法上看,的确是通过多重继承实现的。说不是,因为它的继承依然遵守”is-a”关系,从含义上看依然遵循单继承的原则

class Vehicle(object):
    pass
class PlaneMixin(object):
    def fly(self):
        print("I am flying")
class Airplane(Vehicle, PlaneMixin)
    pass

可以看到,上面的Airplane类实现了多继承,不过它继承的第二个类我们起名为PlaneMixin,而不是Plane,这个并不影响功能,但是会告诉后来读代码的人,这个类是一个Mixin类。所以从含义上理解,Airplane只是一个Vehicle,不是一个Plane。这个Mixin,表示混入(mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同Java中的接口。
使用Mixin类实现多重继承要非常小心

首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等

其次它必须责任单一,如果有多个功能,那就写多个Mixin类

然后,它不依赖于子类的实现

最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了^_^)

ReactJS
var PlaneMixin = function() {
    return {
        fly: function() {
            console.log("I am flying");
        }
    }
}

var AirplaneComponent = React.createClass({
    mixins: [PlaneMixin()],
    render: function() {
        return "

what"s mixin

"; } })

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45469.html

相关文章

  • REST API设计理念 Python Mixin模式

    摘要:飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取语言可没有接口功能,但是它可以多重继承。说是,因为从语法上看,的确是通过多重继承实现的。所以从含义上理解,只是一个,不是一个。比如飞机照样可以载客,就是不能飞了 REST API设计理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...

    iflove 评论0 收藏0
  • Django REST FrameWork中文教程3:基于类的视图

    摘要:看起来不错再次,它现在仍然非常类似于基于功能的视图。我们还需要重构一下我们使用基于类的视图。中文文档目录中文教程序列化中文教程请求和响应中文教程基于类的视图中文教程验证和权限中文教程关系和超链接中文教程中文教程模式和客户端库 我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图。我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY。 使用基于类的...

    UnixAgain 评论0 收藏0
  • Django REST FrameWork中文教程3:基于类的视图

    摘要:看起来不错再次,它现在仍然非常类似于基于功能的视图。我们还需要重构一下我们使用基于类的视图。中文文档目录中文教程序列化中文教程请求和响应中文教程基于类的视图中文教程验证和权限中文教程关系和超链接中文教程中文教程模式和客户端库 我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图。我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY。 使用基于类的...

    shiguibiao 评论0 收藏0
  • Django REST FrameWork中文教程3:基于类的视图

    摘要:看起来不错再次,它现在仍然非常类似于基于功能的视图。我们还需要重构一下我们使用基于类的视图。中文文档目录中文教程序列化中文教程请求和响应中文教程基于类的视图中文教程验证和权限中文教程关系和超链接中文教程中文教程模式和客户端库 我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图。我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY。 使用基于类的...

    canopus4u 评论0 收藏0
  • 用 Django 零成本快速实现 API 服务

    摘要:为什么要用对于序列化数据的解决方案已经有以下几种内建序列化器它可以序列化但无法直接序列化单独的数据。与对依旧有效默认为用法转换为字符串。 写后台的时候经常需要写数据接口,这时就需要用到序列化工具, 而默认到序列化工具对 Django model 的序列化支持有限。 同时 Django 本身的序列化工具我在使用时也觉得有诸多不便,因此我尝试自己写了一个快速序列化工具,帮助我快速简单的实现...

    Worktile 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<