文档章节

Generic adapter class in Python

斯文剑客
 斯文剑客
发布于 2014/01/11 21:43
字数 422
阅读 62
收藏 0

The adapter pattern is often used in programming when you need to adapt one interface to another. Here's a simple generic adapter class that can adapt just about any interface to just about any other.

class Adapter(object):
    """
    Adapts an object by replacing methods.
    Usage:
    dog = Dog()
    dog = Adapter(dog, dict(make_noise=dog.bark))
    """
    def __init__(self, obj, adapted_methods):
        """We set the adapted methods in the object's dict"""
        self.obj = obj
        self.__dict__.update(adapted_methods)
    def __getattr__(self, attr):
        """All non-adapted calls are passed to the object"""
        return getattr(self.obj, attr)


This adapter can be used to adapt many objects with different interfaces into a single, unified interface.


import os
class Dog(object):
    def __init__(self):
        self.name = "Dog"
    def bark(self):
        return "woof!"

class Cat(object):
    def __init__(self):
        self.name = "Cat"
    def meow(self):
        return "meow!"

class Human(object):
    def __init__(self):
        self.name = "Human"
    def speak(self):
        return "'hello'"

class Car(object):
    def __init__(self):
        self.name = "Car"
    def make_noise(self, octane_level):
        return "vroom%s" % ("!" * octane_level)

class Adapter(object):
    """
    Adapts an object by replacing methods.
    Usage:
    dog = Dog
    dog = Adapter(dog, dict(make_noise=dog.bark))
    """
    def __init__(self, obj, adapted_methods):
        """We set the adapted methods in the object's dict"""
        self.obj = obj
        self.__dict__.update(adapted_methods)
    def __getattr__(self, attr):
        """All non-adapted calls are passed to the object"""
        return getattr(self.obj, attr)

def main():
    objects = []
    dog = Dog()
    objects.append(Adapter(dog, dict(make_noise=dog.bark)))
    cat = Cat()
    objects.append(Adapter(cat, dict(make_noise=cat.meow)))
    human = Human()
    objects.append(Adapter(human, dict(make_noise=human.speak)))
    car = Car()
    car_noise = lambda : car.make_noise(3)
    objects.append(Adapter(car, dict(make_noise=car_noise)))

    for obj in objects:
        print "A", obj.name, "goes", obj.make_noise()

if __name__ == "__main__":
    main()


Output:

A Dog goes woof!
A Cat goes meow!
A Human goes 'hello'
A Car goes vroom!!!


python 适配器模式 更详细具体的描述:

http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/

本文转载自:http://ginstrom.com/scribbles/2008/11/06/generic-adapter-class-in-python/

斯文剑客
粉丝 23
博文 55
码字总数 9413
作品 0
昌平
程序员
私信 提问
Understanding Java Lambdas

Understanding Java Lambdas Posted on 2017-04-25 It took me quite some reading and coding to finally understand how Java Lambdas actually work conceptually. Most tutorials and in......

祖冲之
2018/08/02
9
0
为什么 Python 不用设计模式?

作者 | 刘欣 责编 | 伍杏玲 本文经授权转自码农翻身(ID:coderising) 在遥远的Python王国,有一位少年,非常热爱编程,他的父母想给他报一个班,问了万能的朋友圈以后,发现大家都推荐同一...

CSDN资讯
03/18
0
0
大意了,这几道Python面试题没有答对,Python面试题No13

第1题: Python如何爬取 HTTPS 网站? 这类问题属于简单类问题 在使用 requests 前加入:requests.packages.urllib3.disable_warnings()。 为 requests 添加 verify=False 参数 导入ssl模块 ...

梦想橡皮擦
05/21
0
0
linux python pymssql bug?

问题: Ubuntu(version 12.04)-Python(version 2.7.3)的pymssql模块不能取得数据 猜测: bug? 如何解决? 环境1: Ubuntu 11.10 (GNU/Linux 3.0.0-30-generic-pae i686) Python 2.7.2+ (default,......

tim_spac
2013/01/31
378
0
libvirt-python安装及问题处理

问题处理 yum install -y libvirt-devel python-devel pip install libvirt-python .......... to the PKGCONFIGPATH environment variable No package 'libvirt' found running bdist_wheel......

快乐就好-自由
2017/10/27
120
0

没有更多内容

加载失败,请刷新页面

加载更多

idea修改新的git地址

我们在项目变动中通常会遇到更换git地址情况,这里介绍一个在idea项目中简单更换git地址操作: 1、点击VCS; 2、点击Git; 3、点击Remotes; 具体步骤如图 4、点击框中链接即可在右边看到一个...

west_coast
25分钟前
6
0
将规则集传递给mixin

允许包装在mixin中定义的css块。 分离的规则集是一组CSS属性、嵌套规则集、媒体声明或者是存储在变量中的任何其他内容,我们可以将它包含在规则集中或其他结构中,并且所有属性都将复制到那里...

凌兮洛
27分钟前
4
0
玩转阿里云 Terraform(一):Terraform 是什么

从本文起,我将陆续推出一系列有关 Terraform 的文章,从概念,特点,工作机制,用法以及最佳实践等多个方面由浅入深的向大家介绍如何在阿里云上玩转 Terraform。同时也希望借此机会,与感兴...

阿里云官方博客
27分钟前
4
0
科研大数据面临的挑战

近几十年硬件的发展非常迅猛,第一台Macintosh苹果电脑的内存是128KB(0.13MB),现在很多笔记本配的是8GB的内存,硬盘1TB(1024GB),2TB的很常见。大型的数据服务器上还会有更大的储容量,...

英论阁学术院
28分钟前
5
0
python学习10.09:Python列表和元组的底层实现

有关列表(list)和元组(tuple)的底层实现,本节分别从它们的源码来进行分析。 首先来分析 list 列表,它的具体结构如下所示: typedef struct { PyObject_VAR_HEAD /* Vector o...

太空堡垒185
29分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部