文档章节

变量传递**kwargs

极光火狐狸
 极光火狐狸
发布于 2016/05/06 15:30
字数 534
阅读 166
收藏 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中的*args和**kwargs

在Python中的代码中经常会见到这两个词 args 和 kwargs,前面通常还会加上一个或者两个星号。其实这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keywor...

有苦向瓜诉说
2018/11/25
0
0
转-Python 参数知识(变量前加星号的意义)

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

玉龙
2011/09/17
0
0
转-Python参数知识[变量前加星号的意义]

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

玉龙
2012/03/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac 10.14 编译Android 8.1源码及刷入nexus 6p

环境准备 官网 描述得已经相当清楚了 ,这里稍微总结一下: 创建区分大小写的磁盘映像 mac系统默认是不区分大小写的,所以我们需要创建一个区分大小写的文件系统 hdiutil create -type SPARS...

猴亮屏
22分钟前
1
0
js获取url参数

function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var url =decodeURI(decodeURI(window.location.search)); var r = url.substr(1).match(reg);//s......

ArlenXu
29分钟前
1
0
(转)Spring MVC的常用注解

@Controller(常用) 注解一个类表示控制器,Spring MVC会自动扫描标注了这个注解的类。 @RequestMapping(常用) 请求路径映射,可以标注类,也可以是方法,可以指定请求类型,默认不指定为...

政旭Arvin
35分钟前
0
0
Navicat使用教程:在Navicat Monitor for MySQL/MariaDB中配置实例

下载Navicat Monitor最新版本 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona ...

电池盒
38分钟前
0
0
sql根据日期查询,本周,本月,本年,今日相关统计

sql根据日期查询,本周,本月,本年,今日相关统计 昨天 select * from tb where datediff(day, 时间字段 ,getdate()) = 1 今天 select * from tb where datediff(day, 时间字段 ,getdate()) = ...

BraveLN
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部