python获取方法的装饰方法_python中的方法和装饰器

[TOC]

装饰器

python中的装饰器(decorator)是在pep 318中被首次引入,它的本质是一个函数这个函数是接受其它参数为参数,并且用一个新的,修改后的函数作为替换,最常见的装饰器就classmethod和staticmethod

def happy(f):

return lambda x:2*x

@happy

def haha(x):

print "you can't see me"

return 12*x

print haha(1)

方法

方法是作为类属性的函数

如果直接调用类方法,py2里会提示是一个未绑定的方法,py3里会提示这是一个函数

class happy():

name = 'happy'

def hh(self,ddd):

return ddd

print happy.hh('aaa')

python3里,可以传入一个实例化的class进去,调用未绑定的方法

class happy():

name = 'happy'

def hh(self,ddd):

return ddd

print(happy.hh(happy(),'aaa'))

静态方法 staticmethod

除了python3里传未绑定的类给类方法之外,还有个办法可以调用未绑定的类方法

就是静态方法

class happy():

name = 'happy'

@staticmethod

def hh():

return 111

print happy.hh()

静态方法就是定义类方法时候加一个staticclass的decorator,它有几个好处

调用方法前,不必实例化方法,减少开销

提高代码可读性

可以在子类中覆盖静态方法

类方法 classmethod

classmethod是直接绑定到类的方法

类方法最有用的是创建工厂方法,也就是以特定方式实例化对象

类方法定义时候,总是要绑定到它附着的类上,而且它的第一个参数必须是类本身,比如

class happy():

name = 'happy'

@classmethod

def hh(cls):

return 111

print happy.hh()

抽象方法 abstactclass和abc

抽象方法是在基类里定义的,但是需要子类继续完善的方法

好多语言里,抽象方法只能定义,不能实现,py里抽象方法是可以实现一些通用功能,并且,通过super,在子类里被调用

如果不用abc,类被继承,但是抽象方法没重新实现的时候,抽象方法不被调用就不会报错

解决方案就是用abc,示例如下

import abc

class happy():

__metaclass__ = abc.ABCMeta

name = 'happy'

@staticmethod

@abc.abstractmethod

def hh(ddd):

return ddd.name + 'static'

print happy.hh('aaa')

混合使用三种方法

静态方法或者类方法可以和抽象方法混用

如果混用了,抽象方法在子类里,无须实例化,即可调用

示例如下

import abc

class happy():

__metaclass__ = abc.ABCMeta

name = 'happy'

@staticmethod

@abc.abstractmethod

def hh(ddd):

return ddd + 'static'

class haha(happy):

def aa(self):

return super(haha,self).name

print haha().hh('dd')

super

python比较牛逼的地方是支持mixin和多重继承,可以很方便的通过super函数,调用一个类的父类,那么问题来了,如果一个方法,再多个父类里都有,那么调用那个父类呢?这就涉及一个mro的算法,mro变换过多次,最近的一次是py2.3里实现的c3算法,C3算法解决了单调性问题和只能继承无法重写问题

python里的super算法,总体可以归结成一句话,自上到下,自左到右

把左边的类,从上到下遍历过了,才会遍历

就像下面的图,遍历顺序是a b d c e f

c3算法更具体解释可以参见官网

class D(object):

pass

class E(object):

pass

class F(object):

pass

class C(E, F):

pass

class B(D,E):

pass

class A(B, C):

pass

if __name__ == '__main__':

print A.__mro__

6

---

Level 3 | O | (more general)

/ --- \

/ | \ |

/ | \ |

/ | \ |

--- --- --- |

Level 2 3 | D | 4| E | | F | 5 |

--- --- --- |

\ \ _ / | |

\ / \ _ | |

\ / \ | |

--- --- |

Level 1 1 | B | | C | 2 |

--- --- |

\ / |

\ / \ /

---

Level 0 0 | A | (more specialized)

---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一帮一python_[python]L1-030 一帮一 (15分)

L1-030 一帮一 (15分)“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中&#xf…

java书面_Java程序猿的书面采访String3

public class SameString {//思想二:每个字符都相应着自己的ASC码,第一个思想的算法复杂度为O(nlogn)。一般能够利用空间来减少时间复杂度//能够开辟一个大小为256的数组空间,而且将256个数组元素都置为0,然后遍历第一个字符串把字…

java fangfa_daicanfangfa java中的方法 刚入门的分不清带参方法的作用和用处 这个可以详细的讲解如何使用带参方法 - 下载 - 搜珍网...

第14章 带参数的方法/01 教学演示示例/示例1:带一个参数的方法/StudentsBiz.java第14章 带参数的方法/01 教学演示示例/示例1:带一个参数的方法/TestAdd.java第14章 带参数的方法/01 教学演示示例/示例2:带多个参数的方法/StudentsBiz.java第…

java sqlite 工具类_Java 工具类 - JDBC通用操作基类 BaseDao

封装了增删改查功能适用于MySQL、Oracle、SQLServer、DB2、Sybase、JTDS、PostgreSql、SQLite、Derby、H2、HSQLDB、ODBC 等等数据库,有需要的还可以自己增加。package com.tgb.hz.jdbc;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.namin…

java 跨域 下载文件_文件下载重命名(可跨域)

一、正常情况下,我们都如此下载文件并修改文件名,在a标签上面添加download属性var link document.createElement(a);link.href file.url;link.download file.name;link.target"_blank";link.click();由于a.download跨域会失效,上…

java hibernate 插入数据_[Java教程]hibernate 返回新插入数据的Id

[Java教程]hibernate 返回新插入数据的Id0 2015-08-28 10:00:11例如 表明 studentInfoString sql"set set nocount on studentInfo(列名,列名) values(值,值);select identity as inserId";java代码:public int executeCount(String sql, Map paramMap) {…

java输入行数打印菱形_JAVA题,输入行数,输入列数,输出一个菱形

展开全部1,冒泡排序1. /**2. * JAVA排序算法实现代码-冒泡(Bubble Sort)排序。3. *4. *5. *6. */7. public class Test {8. public static void main(String[] args) {9. int[] a ;10.11. System.out.print("排序前: ");12.13. for (int i 0; i < a.length; i)1…

mysql 密码大小写_MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写...

MySQL数据库认证密码有两种方式:1&#xff1a;MySQL 4.1版本之前是MySQL323加密2&#xff1a;MySQL 4.1和之后的版本都是MySQLSHA1加密还有函数:AES_ENCRYPT()加密函数和AES_DECRYPT()解密函数和MD5()加密。MySQL数据库中自带old_password(str)和password(str)函数,前者是MySQL…

三星手机 java_如何在三星手机上安装Java ME应用程序?

我的手机应该可以运行&#xff1a;JavaTM&#xff1a;MIDP 2.0,基于CLDC 1.1的应用程序.但是,无论我尝试在其上安装哪个应用程序,我都会收到错误&#xff1a;已下载的JAR无效我已经尝试在Netbeans上构建Java ME项目,使用指定的MIDP 2.0和CLDC 1.1.这些应用程序很简单,使用Netbe…

openshift 3 mysql_最新OpenShift免费空间申请与使用教程-1G内存1G空间支持PHP和MysqL

一、OpenShift空间申请使用前必备工具1、OpenShift官网&#xff1a;1、官方网站&#xff1a;https://www.openshift.com/2、OpenShift V3&#xff1a;https://manage.openshift.com/2、Github账号(或者其他的git仓库也可以..)。注册git仓库是为了方便的实现代码的同步&#xff…

python 简单web音频_Python Twisted web服务器音频fi

我尝试用python中的twisted创建一个简单的web服务器。不过&#xff0c;我无法提供m4a音频文件。在在当前程序中&#xff0c;当我加载http://localhost:8880/mp3.html时&#xff0c;它可以正常工作。它显示音频播放器和mp3播放。此外&#xff0c;程序同时打印“/mp3.html”和/测…

cpython教程_python高性能扩展工具-cython教程1快速入门

Cython不仅仅是一种编程语言。它的起源可以追溯到SAGE数学软件包&#xff0c;它用于提高数学计算性能&#xff0c;例如涉及矩阵的计算。更一般地说&#xff0c;我倾向于将Cython视为SWIG的替代品&#xff0c;为本机代码生成非常好的Python绑定。SWIG是最早和最好之一&#xff0…

golang mysql封装_golang如何封装路由

封装方式一、路由写在 main函数中&#xff0c;数据库初始连接放在 init() 函数中。、首先看 main.go一个初始化函数&#xff0c;初始化 dbfunc init() {db.Connect()}第二&#xff0c;路由func main() {// Configurerouter : gin.Default()// Set html render optionshtmlRende…

在java继承机制中 父类中的私有_Java中子类能继承父类的私有属性吗?

前段时间去听老师讲课的时候&#xff0c;老师告诉我子类是可以继承父类所有的属性和方法的。当时我是极其疑惑的&#xff0c;因为之前学校考试时这个考点我记得很清楚&#xff1a;子类只能继承父类的非私有属性和方法。老师给我的解释是这样的——先看下面一段代码/*** 定义父类…

堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系

前言&#xff1a;上一篇中我们介绍了new关键字 点击打开链接&#xff0c;new一个类&#xff0c;实际上就是调用该类的构造函数&#xff0c;返回该类的对象。如a new Animal();返回的对象赋给变量a。我们来分析一下内存分配的步骤&#xff0c;new一个类&#xff0c;实际上就创造…

java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端

没有借助任何第三方库&#xff0c;完全基于JAVA Socket实现一个最小化的HTTP文件下载客户端。完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与保存文件内容。如何通过SwingWork实…

java读c二进制文件_如何使用JAVA读取C / Matlab创建的二进制文件

小编典典正如我所猜测的那样&#xff0c;这是一个字节序问题&#xff0c;即您的二进制文件被写为低字节序的整数(可能是因为您使用的是Intel或类似的CPU)。但是&#xff0c;无论Java代码运行在哪个CPU上&#xff0c;它都在读取大端整数。为了显示该问题&#xff0c;以下代码将读…

java 通联支付接口_allinpay 通联支付接口实例

【实例简介】allinpay 支付的实例代码&#xff0c;这只是部分&#xff0c;需要其它的请联系我。 帮忙找【实例截图】【核心代码】201708081652114811└── unionorder_demo├── java│ └── uniondemo│ ├── WebContent│ │ ├── META-INF│ │ │ └…

java web tcp长连接超时时间_常用java web容器http长连接超时设置

1.http长连接相关知识http长连接对我们来说并不陌生&#xff0c;但长连接并不是永远不会关闭。对于HTTP长连接需要注意下面几点&#xff1a;keepalive_timeout指的是web服务器发送完最后一个响应报文后&#xff0c;开始计时&#xff0c;如果在keepalive_timeout指定的时间内还没…

java相遇问题_行程问题

行程问题 《行程问题》说课设计——现代教育信息技术与数学学科的整合福建省闽侯县尚干中心小学 林惠贞 邮编&#xff1a;350112 邮箱:zhenzi2277163.com众所周知,未来的教育&#xff0c;倡导开放式学习&#xff0c;把学习的地点扩展到社会、网络&…