文档章节

变量传递**kwargs

极光火狐狸
 极光火狐狸
发布于 2016/05/06 15:30
字数 534
阅读 146
收藏 0
点赞 2
评论 0

阅读源码经常看到以**kwargs进行传递, 却不知道人家为什么要这样写.

比如说Tornado源码,位置在: websocket.py文件 -> WebSocketHandler类 -> send_error方法中,就采用了 **kwargs.

class WebSocketHandler(tornado.web.RequestHandler):

    ......
    ......
    ......    
    
    
    def send_error(self, *args, **kwargs):
        if self.stream is None:
            super(WebSocketHandler, self).send_error(*args, **kwargs)
        else:
            # If we get an uncaught exception during the handshake,
            # we have no choice but to abruptly close the connection.
            # TODO: for uncaught exceptions after the handshake,
            # we can close the connection more gracefully.
            self.stream.close()

通过super的方式,直接调用父类tornado.web.RequestHandler的send_error方法, 接下来省略5000字。。。。

 

来模拟一下这种写法,如果在调用父类时,不传这个**kwargs,看看会发生什么情况。

python 2.7

# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'


class People(object):
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age


class Friend(People):
    def __init__(self, phone, **kwargs):
        super(Friend, self).__init__(**kwargs)
        self.phone = phone

    def show(self):
        return self.phone, self.age, self.name, self.sex

if __name__ == '__main__':
    s = Friend('12345678911')
    print(s.show())
    
# 运行结果
C:\Python27\python.exe C:/Users/zt/PycharmProjects/multi_super.py
Traceback (most recent call last):
  File "C:/Users/zt/PycharmProjects/multi_super.py", line 21, in <module>
    s = Friend('12345678911')
  File "C:/Users/zt/PycharmProjects/multi_super.py", line 14, in __init__
    super(Friend, self).__init__(**kwargs)
TypeError: __init__() takes exactly 4 arguments (1 given)

Process finished with exit code 1

 

python 3.5

# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'


class People(object):
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age


class Friend(People):
    def __init__(self, phone, **kwargs):
        super(Friend, self).__init__(**kwargs)
        self.phone = phone

    def show(self):
        return self.phone, self.age, self.name, self.sex

if __name__ == '__main__':
    s = Friend('12345678911')
    print(s.show())
    

#运行结果
C:\Python35-32\python.exe C:/Users/zt/PycharmProjects/multi_super2.py
Traceback (most recent call last):
  File "C:/Users/zt/PycharmProjects/multi_super2.py", line 21, in <module>
    s = Friend('12345678911')
  File "C:/Users/zt/PycharmProjects/multi_super2.py", line 14, in __init__
    super(Friend, self).__init__(**kwargs)
TypeError: __init__() missing 3 required positional arguments: 'name', 'sex', and 'age'

Process finished with exit code 1

 

两份几乎一样的代码,抛出来的异常缺不一样,python3清晰明了的告诉你为什么报了这个错误.

 

 

利用这种方式的好处是,透明传输(不需要关系传递过程中出现偏差),报错也是由被调用的函数抛出错误.

缺点是新手看不懂这是做什么用的,为什么这样做。

 

参考:

    书籍: <python 3 面向对象编程>

© 著作权归作者所有

共有 人打赏支持
极光火狐狸
粉丝 11
博文 29
码字总数 14739
作品 0
普陀
Python 进阶语法一

一、*args和**kwargs 很多刚接触 Python 的程序员都需要用很长一段时间才能理解 *args 和 **kwargs 这两个魔法变量。那么它们到底是什么呢?首先可以告诉你,其实并不是必须写成 *args和 **...

东方神剑
2016/11/26
11
0
函数的定义、解构、及销毁过程

函数主要作用为了复用 函数中的return定义 函数中,所有的语句都是有retrun操作,如果函数没有自定义的return,则默认retrun None值 形参和实参 参数中,是一种形式的表示,一种符号的表达简...

zuzhou
2017/10/17
0
0
Python 装饰器的总结(二)

接着上一篇 7,函数是Python世界中的一级类对象 在Python里函数和其他东西一样都是对象 函数在Python里就是对象,和其他一样,在Python里,函数只是一些普通的值而已,也就是说把函数像参数一样传...

浅浅的凉意
2017/07/11
0
0
转-Python参数知识[变量前加星号的意义]

From:http://blog.sina.com.cn/s/blog4bfd07180100g34k.html 1.过量的参数 在运行时知道一个函数有什么参数,通常是不可能的。另一个情况是一个函数能操作很多对象。更有甚者,调用自身的函数...

玉龙
2012/03/03
0
0
转-Python 参数知识(变量前加星号的意义)

自:http://blog.csdn.net/qinyilang/article/details/5484415 过量的参数 在运行时知道一个函数有什么参数,通常是不可能的。另一个情况是一个函数能操作很多对象。更有甚者,调用自身的函数...

玉龙
2011/09/17
0
0
【函数】01、函数基础

一、函数 1、函数 函数是python中组织代码的最小单元 函数是实现模块化编程的基本组件 Python使用def语句定义函数 每个Python函数都有一个返回值,默认为None,也可以使用“return value”明...

xiexiaojun
2017/06/09
0
0
Python *args和**kwargs

人生苦短,我用Python。 北静王 --中科院-虚拟经济与数据科学研究中心在读博士生,主要研究方向为NLP,DL,ML。 前言: 今天在研究代码的时候,review前几天的decorator函数并增添新的功能的...

北静王
2017/07/09
0
0
Python: 函数参数魔法

函数参数 在 Python 中,定义函数和调用函数都很简单,但如何定义函数参数和传递函数参数,则涉及到一些套路了。总的来说,Python 的函数参数主要分为以下几种: 必选参数 默认参数 可变参数...

铁扇公主1
2017/05/18
80
0
Python基础:Python函数

一、函数是python中使用最高的对象。 函数定义的简单规则 : 1、用def定义,接着是函数名和参数和冒号,格式: 2、函数内部代码块需要缩进 3、使用return返回函数值,默认返回值是None 格式:...

等你的破船
07/02
0
0
python之装饰器

装饰器(Decorator) 使用场景:为被装饰器装饰的函数增加功能,但又不希望修改函数的定义,即在代码运行期间动态增加功能。 装饰器更多的用于后期功能升级而不是编写新的代码。装饰器不光能...

东丶
2017/06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
16分钟前
0
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
28分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
33分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
48分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
55分钟前
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
今天
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
今天
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0
转行零基础该如何学Python?这些一定要明白!

转行零基础学Python编程开发难度大吗?从哪学起?近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大?今天,小编就来为大家详细解读一下这个问题。...

猫咪编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部