返回顶部
首页 > 资讯 > 后端开发 > Python >python委托模式详细解释
  • 644
分享到

python委托模式详细解释

模式详细python 2023-01-31 06:01:02 644人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

收集了网上的三个例子,然后做了些注释: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Wrapper: def __init__(self, obj):

收集了网上的三个例子,然后做了些注释:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


class Wrapper:
    def __init__(self, obj):
        self.wrapper = obj
        print self.wrapper
        print type(self.wrapper)
        print"-"*100

    def __getattr__(self, item):
        print("trace:", item)
        return getattr(self.wrapper, item)


if __name__ == '__main__':
    x = Wrapper([1, 2, 3, 4])
    x.append(35)
    x.remove(2)
    print(x.wrapper)  # [1,3,4,35]

  1. __init__(self,obj)方法中传入一个被委托对象。
  2. 通过重写__getattr__(self,item)方法,拦截外部对象的属性调用
  3. __getattr__(self,item)中,将拦截到的属性,让被委托对象去使用。

    python 中的属性概念,和Java中的属性概念是不同的。Java中的属性,就是指类中定义的成员变量,绝对不包含方法。而在Python中,任何能以obj.xx形式调用的东西,全部可以称为属性。无论是方法,还是变量,还是对象。

所以上述代码中调用x.append(N),实际上是让x的属性wrapper去调用append(N)方法。

上面传入的参数是[1,2,3,4],是一个list类型的对象,该对象自然可以调用append remove这些方法。

这个转载自:

Http://blog.csdn.net/DucklikeJAVA/article/details/73729212

---------------------------------------------------------------------------------------------------------------

#-*- encoding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class A:
    def f_one(self, x):
        print"here is f_one"
        print"x=",x
        print"-"*100

    def f_two(self):
        print"here is f_two"
        print"-"*100

class B(A):
    def __init__(self):
        self._a = A()#也就是说在类B中有个成员变量例化了类A,_a是A的对象,不要太在意_a这个奇怪的名字
    
    def f_one(self, x):
        return self._a.f_one(x)

    def f_two(self):
        return self._a.f_two()

    def f_three(self):
        print"Here is B(A)"
if __name__ == '__main__':
    b_test=B()
    x=6
    b_test.f_one(x)
    b_test.f_two()
    

这就是一个最简单的委托,将A的实例在B类中生成,并且转化为B的一个私有属性,当我们需要访问A的属性的时候,加入我们只暴露B出来,这时候就只能通过B类来访问A类,这就达到了委托的效果。

上面的这种方法使用情景为:有几个方法需要委托,当我们需要大量委托的时候这显然不是一个好办法,这时候还有另一个更巧妙的方法:getattr()方法,下面请看代码:

#-*- encoding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class A:
    def f_one(self, x):
        print"here is f_one"
        print"x=",x
        print"-"*100

    def f_two(self):
        print"here is f_two"
        print"-"*100

class B(A):
    def __init__(self):
        self._a = A()

    def f_three(self):
        pass

    def __getattr__(self, name):#相当于重写了__getattr__,利用__getattr_来实现委托的效果(其实委托就是甩锅的意思啦,B搞不定,甩锅给A)
        return getattr(self._a, name)
if __name__ == '__main__':
    b_test=B()
    x=6
    b_test.f_one(x)
    b_test.f_two()


这里要注意一下这个新的方法,这个方法的作用是用来查找所有的属性,放在这里时,如果代码中尝试访问这个类中不存在的属性时,会去调用实例_a中的属性,这样就可以实现大量的代理。



--结束END--

本文标题: python委托模式详细解释

本文链接: https://lsjlt.com/news/190175.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python委托模式详细解释
    收集了网上的三个例子,然后做了些注释: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Wrapper: def __init__(self, obj): ...
    99+
    2023-01-31
    模式 详细 python
  • Java 单例模式详细解释
    目录饿汉式懒汉式懒汉式(加锁synchronized)懒汉式(部分加锁synchronized)懒汉式(DCL)懒汉式(DCL)最终版静态内部类总结饿汉式 public cla...
    99+
    2024-04-02
  • ios委托模式怎么实现
    本篇内容介绍了“ios委托模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Cocoa Touch框架下使用大量使用委托(deleg...
    99+
    2023-07-05
  • C#委托用法详解
    目录1、什么是委托2、委托的定义3、委托的实例化3.1 使用new关键字3.2 使用匿名方法3.3 使用Lambda表达式4、泛型委托5、C#内置泛型委托6、多播委托1、什么是委托 ...
    99+
    2024-04-02
  • C#中的委托详解
    如果要给方法传递一个方法参数时,就可以使用委托。要传递方法,就必须把方法的细节封装在一钟新类型的对象中,即委托。委托是一种特殊类型的对象,其特殊之处在于,我们以前定义的所有对象都包含...
    99+
    2024-04-02
  • js事件委托详解
    1、每个函数都是对象,占用内存。内存中的对象越多,性能越差。解决事件处理过多问题的办法是事件委托。 2、事件委托冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。 实例 ...
    99+
    2024-04-02
  • Java简单工厂模式详细解释
    目录简单工厂模式概述简单工厂模式的结构与实现结构:实现简单工厂模式的简化简单工厂模式的优缺点和适用环境简单工厂模式的优点简单工厂模式的缺点简单工厂模式的适用环境简单案例题目:UML:...
    99+
    2024-04-02
  • c#委托与事件(详解)
    目录前言一、声明方法二、声明委托三、实例化委托四、使用委托总结前言 .NET中的委托是一个类,它定义了方法的类型,是一个方法容器。委托把方法当作参数,可以避免在程序中大量使用条件判...
    99+
    2024-04-02
  • Android开发Viewbinding委托实例详解
    目录背景从Crash到有意思的源码有趣的代码另外一些有意思的地方结尾背景 前一阵子我们在使用viewbinding的委托的时候碰到了点crash问题,然后发现了一个比较有意思的解决方...
    99+
    2024-04-02
  • C#中的委托和事件详解
    从大学就开始做C#这块,也做C#几年了,最近又从ios转回.Net,继续做C#,之前也没有写博客的习惯,写博客也是从我做ios的时候开始的,现在既然又做回了.net,那就写点关于.N...
    99+
    2024-04-02
  • ClassLoader双亲委派模式作用详解
    目录前言ClassLoader的作用ClassLoader的种类如何实现双亲委派模式小测试前言 我们的面试中经常会遇到关于ClassLoader的问题,但是我们的日常开发中又没有直接...
    99+
    2022-11-13
    ClassLoader双亲委派 ClassLoader 模式
  • python中savgol_filter的详细解释
    目录 savgol_filter简介savgol_filter原理参数window_length对平滑的效果参数polyorder的平滑效果 savgol_filter简介 Savitzk...
    99+
    2023-10-06
    python 人工智能 开发语言
  • JavaScript中事件委托的示例详解
    目录事件流事件委托结尾大家好,我是前端西瓜哥。今天我们来认识一下事件委托。 所谓事件委托,就是将原本应该在当前元素绑定的事件,放到它的祖先元素上,让祖先元素来委托处理。 事件流 事件...
    99+
    2024-04-02
  • 深入理解Java中观察者模式与委托的对比
    目录代码背景观察者模式介绍实现观察者(学生)通知者(老师)Main方法观察者通知者 事件事件处理 委托 介绍 总结代码背景 一个班级,有两类学生,A类:...
    99+
    2024-04-02
  • c#委托与事件属于哪种设计模式
    委托和事件属于行为型设计模式中的观察者模式,其中委托充当观察者,事件充当主题。该模式定义了一对多的依赖关系,主题状态变化时会通知观察者,观察者可相应更新自己的状态。 委托与事件属于哪种...
    99+
    2024-04-04
    c#
  • Java设计模式之java解释器模式详解
    目录介绍角色计算器案例UML图深入挖掘构建的语法树解释器模式总结解释器模式的典型应用Spring EL表达式中的解释器模式参考文章总结介绍 解释器模式(Interpreter Pat...
    99+
    2024-04-02
  • 详细解释opencv python中的 cv.approxPolyDP
    在OpenCV Python中,cv.approxPolyDP是一个用于多边形逼近的函数。它使用Douglas-Peucker算法来减少多边形的点数。 该函数需要两个参数:输入多边形和一个表示逼近精度...
    99+
    2023-09-10
    opencv python 计算机视觉
  • getRealPath详细解释
    getRealPath是一个方法,用于获取指定文件路径的真实路径。在Java中,当我们使用相对路径来访问文件时,有时候可能会遇到问题...
    99+
    2023-09-13
    getRealPath
  • 详解C#中委托的概念与使用
    目录委托的概念多播委托拖动按钮委托的概念 委托这个名字取的神乎其神的,但实质是函数式编程,把函数作为参数传递给另一个参数。对于C语言程序员来说,就是把函数指针当作参数传递给另一个函数...
    99+
    2023-02-27
    C#委托使用 C#委托
  • 事件委托模式怎么在java项目中实现
    这篇文章将为大家详细讲解有关事件委托模式怎么在java项目中实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java实现事件委托模式的实例详解举例说明:一个班级,有两类学生,A类:不学习,...
    99+
    2023-05-31
    java 事件委托模式 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作