为什么 Python 不支持java 构造函数重载载

1752人阅读
python中的init函数重载与覆盖问题
先看一段代码,利用重载特性实现了多个init函数。
urlHk = '/apistore/stockservice/hkstock?stockid=%s&list=1'
urlSh = '/apistore/stockservice/stock?stockid=sh%s&list=1'
urlSz = '/apistore/stockservice/stock?stockid=sz%s&list=1'
stockTypeDic = {'hk': urlHk, 'sh': urlSh, 'sz': urlSz}
stockIdHeadDic = {'0': 'sz', '6': 'sh'}
class MakeUrl(object):
print ('makeurl')
def __init__(self):
self.url = urlSh
def __init__(self, stockid):
self.putStockId(stockIdHeadDic[str(stockid)[0]], stockid)
def __init__(self, stockType, stockid):
self.putStockId(stockType, stockid)
def putStockId(self, stockid):
self.url = '/apistore/stockservice/hkstock?stockid=%s&list=1' % (stockid)
def putStockId(self, stockType, stockid):
self.url = stockTypeDic[stockType] % (stockid)
实际调用时编译器却报了错,调用代码如下
urlMaken = GetStockInfo.MakeUrl('601668')
报错如下:
File "/usr/local/workspace/pycharmPro/NetDataApiLab.py", line 11, in &module&
urlMaken = GetStockInfo.MakeUrl('601668')
TypeError: __init__() takes exactly 3 arguments (2 given)
意思是init函数需要3个参数,但是自己却只给了2个
由于偶是学c++的
我想起自己c++编程时多个构造函数是没有问题的。
后来想了想又突然明白了
python中没有switch语句
为了发挥灵活性
多用字典来代替
为了保持代码的简洁
构造函数也只有一个
参数列表最长的一个覆盖其他的构造函数
当需要实现变长参数个数时
采用默认值来实现
也即同名的函数只需要一个就够了
python代码确实简洁
不过缺点是编译时如果没有调用
纵然定义了多个重载函数也不会报错
只有当调用参数较少重载函数时才会报出来
修改后代码如下
class MakeUrl(object):
print ('makeurl')
def __init__(self, stockid, stockType='sh'):
self.putStockId(stockIdHeadDic[str(stockid)[0]], stockid)
def putStockId(self, stockType, stockid):
self.url = stockTypeDic[stockType] % (stockid)
不得不惊叹python在简洁完美的同时又具有强大的功能
生活如果不是一场勇敢的冒险就什么也不是
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:154507次
积分:2149
积分:2149
排名:第16929名
原创:75篇
转载:17篇
评论:17条
(1)(3)(1)(4)(4)(5)(4)(4)(5)(9)(7)(6)(11)(7)(3)(11)(2)(1)(2)(1)(1)(1)首先必看的是官网的文档, &a href=&///?target=http%3A//tornadoweb.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&tornadoweb.org/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a& ,内容很少很快可以扫完,这里有中文翻译版, &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&。&br&&br& tornado的新书 Introduction to tornado:&br&&a href=&///?target=http%3A///gp/product//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Introduction to Tornado: Michael Dory, Adam Parrish, Brendan Berg: 7: : Books&i class=&icon-external&&&/i&&/a&&br&&br&这个slide也不错介绍了各个方面,有些文档中提及的也不是很详细 &a href=&///?target=http%3A///doc//An-Introduction-to-Tornado& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/doc/&/span&&span class=&invisible&&/An-Introduction-to-Tornado&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&关于tornado的模板,一般介绍的都不是很多,这篇文章可能会令你大有收获 &a href=&///?target=http%3A///posts/9& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Joshua Inkenbrandt&i class=&icon-external&&&/i&&/a&&br&&br&此外就是多看tornado的源代码,tornado的源码很清晰。 yuhen同学这里有几篇tornado源码分析的文章不错&a href=&///?target=http%3A//www.rainsts.net/article.asp%3Fid%3D1045& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&rainsts.net/article.asp?&/span&&span class=&invisible&&id=1045&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&,当然其他文章也很精彩。&br&&br&example可以看tornado自带的几个例子差不多了,另外tornadoio(&a href=&///?target=https%3A///MrJoes/tornadio& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mrjoes/tornadio · GitHub&i class=&icon-external&&&/i&&/a&),Timan(&a href=&///?target=https%3A///gmr/Tinman& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&gmr/Tinman · GitHub&i class=&icon-external&&&/i&&/a&),Pika(&a href=&///?target=https%3A///pika/pika& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&pika/pika · GitHub&i class=&icon-external&&&/i&&/a&)也都是基于tornado比较出名的项目,但都不是常规的web应用。推荐你可以看看飞龙在天写的poweredsites(&a href=&///?target=https%3A//bitbucket.org/felinx/poweredsites& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&felinx / PoweredSites&i class=&icon-external&&&/i&&/a&)。&br&42qu的zpage(&a href=&///?target=https%3A//bitbucket.org/zuroc/zpage& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zuroc / zpage / wiki / Home&i class=&icon-external&&&/i&&/a& )
&br&&br&介绍tornado的ioloop的slide:&br&&a href=&///?target=http%3A///doc//The-Tornado-IOLoop& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/doc/&/span&&span class=&invisible&&/The-Tornado-IOLoop&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&分析tornado内部结构的slide:&br&&a href=&///?target=http%3A//www.slideshare.net/pgollakota/tornado-web-server-internals& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&slideshare.net/pgollako&/span&&span class=&invisible&&ta/tornado-web-server-internals&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
首先必看的是官网的文档,
,内容很少很快可以扫完,这里有中文翻译版, 。 tornado的新书 Introduction to tornado:
Python 没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。&br&&br&Python 没有「变量」,我们平时所说的变量其实只是「标签」。执行 &br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&values&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&]&/span&
&/code&&/pre&&/div&的时候,Python 做的事情是首先创建一个列表对象 [0, 1, 2],然后给它贴上名为 values 的标签。如果随后又执行&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&values&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&]&/span&
&/code&&/pre&&/div&的话,Python 做的事情是创建另一个列表对象 [3, 4, 5],然后把刚才那张名为 values 的标签从前面的 [0, 1, 2] 对象上撕下来,重新贴到 [3, 4, 5] 这个对象上。&br&&br&至始至终,并没有一个叫做 values 的列表对象容器存在,Python 也没有把任何对象的值复制进 values 去。过程如图所示:&br&&img src=&/24c11ffb9b674bcb477d_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/24c11ffb9b674bcb477d_r.jpg&&执行&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&values&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&values&/span&
&/code&&/pre&&/div&的时候,Python 做的事情则是把 values 这个标签所引用的列表对象的第二个元素指向 values 所引用的列表对象本身。执行完毕后,values 标签还是指向原来那个对象,只不过那个对象的结构发生了变化,从之前的列表 [0, 1, 2] 变成了 [0, ?, 2],而这个 ? 则是指向那个对象本身的一个引用。如图所示:&br&&img src=&/de598f0b29e8fb0631dcb41b3e11039b_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/de598f0b29e8fb0631dcb41b3e11039b_r.jpg&&&br&要达到你所需要的效果,即得到 [0, [0, 1, 2], 2] 这个对象,你不能直接将 values[1] 指向 values 引用的对象本身,而是需要吧 [0, 1, 2] 这个对象「复制」一遍,得到一个新对象,再将 values[1] 指向这个复制后的对象。Python 里面复制对象的操作因对象类型而异,复制列表 values 的操作是 &div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&values&/span&&span class=&p&&[:]&/span&
&/code&&/pre&&/div&所以你需要执行&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&values&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&values&/span&&span class=&p&&[:]&/span&
&/code&&/pre&&/div&Python 做的事情是,先 dereference 得到 values 所指向的对象 [0, 1, 2],然后执行 [0, 1, 2][:] 复制操作得到一个新的对象,内容也是 [0, 1, 2],然后将 values 所指向的列表对象的第二个元素指向这个复制二来的列表对象,最终 values 指向的对象是 [0, [0, 1, 2], 2]。过程如图所示:&br&&img src=&/453bf3f1ccdbd_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/453bf3f1ccdbd_r.jpg&&往更深处说,values[:] 复制操作是所谓的「浅复制」(shallow copy),当列表对象有嵌套的时候也会产生出乎意料的错误,比如&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&],&/span& &span class=&mi&&3&/span&&span class=&p&&]&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&a&/span&&span class=&p&&[:]&/span&
&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&mi&&8&/span&
&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&][&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&mi&&9&/span&
&/code&&/pre&&/div&问:此时 a 和 b 分别是多少?&br&&br&正确答案是 a 为 [8, [1, 9], 3],b 为 [0, [1, 9], 3]。发现没?b 的第二个元素也被改变了。想想是为什么?不明白的话看下图&br&&img src=&/86ee9999b44ecd81ed6a_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/86ee9999b44ecd81ed6a_r.jpg&&正确的复制嵌套元素的方法是进行「深复制」(deep copy),方法是&div class=&highlight&&&pre&&code class=&language-python&&&span class=&kn&&import&/span& &span class=&nn&&copy&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&],&/span& &span class=&mi&&3&/span&&span class=&p&&]&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&copy&/span&&span class=&o&&.&/span&&span class=&n&&deepcopy&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&)&/span&
&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&mi&&8&/span&
&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&][&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&mi&&9&/span&
&/code&&/pre&&/div&&img src=&/4f5fdd1d98e68d4a4c0d6ae311fb14c1_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/4f5fdd1d98e68d4a4c0d6ae311fb14c1_r.jpg&&
Python 没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。 Python 没有「变量」,我们平时所说的变量其实只是「标签」。执行 values = [0, 1, 2]
的时候,Python 做的事情是首先…
直接空白Vim使用 John Anderson 的配置就行了&br&&blockquote&&b&Turning Vim into a modern Python IDE&/b&&br&&b&鏈接:&a href=&///?target=http%3A//sontek.net/turning-vim-into-a-modern-python-ide& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&sontek.net/turning-vim-&/span&&span class=&invisible&&into-a-modern-python-ide&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/b&&/blockquote&附上我的Vim截圖一張:&img src=&/95a1cd169b5a1b0f627e2_b.jpg& class=&content_image&&
直接空白Vim使用 John Anderson 的配置就行了 Turning Vim into a modern Python IDE 鏈接:附上我的Vim截圖一張:
Vim上真正牛逼的地方不是代码补全提示功能这些功能(我不知道有没有提示,但是补全功能很多),而是快速定位,快速把想要的代码格式化。&br&&br&我主要是在格式上配置了一些插件和设定。编译和调试还没有弄。下面所说的都是linux系统上的设定,win下有些地方不一样。&br&&br&首先要在vimrc里针对python设置格式(这是我目前的最简设置):&blockquote&&显示行数,设置软回车和缩进还有语法&br&set number&br&set expandtab&br&set tabstop=8&br&set shiftwidth=4&br&set softtabstop=4&br&set autoindent&br&:syntax on&br&&补全设置,不设也能用&br&let Tlist_Ctags_Cmd='/usr/bin/ctags'&br&filetype plugin indent on&br&filetype plugin on&br&set ofu=syntaxcomplete#Complete&br&&这个是我喜欢的,一旦一行的字符超出80个的话就把那些字符的背景设为红色&br&highlight OverLength ctermbg=red ctermfg=white guibg=#592929 &br&match OverLength /\%81v.\+/&/blockquote&&br&剩下的一些插件我装了:&blockquote&VCS(版本控制,支持git,svn,hg等等)&br&Tabular(非常方便的排版工具)&/blockquote&&br&剩下就是一些技巧了,只有慢慢练才可以&br&偷懒复制一下我在者也上的答案:&br&&a href=&///?target=http%3A//zheye.org/asks/4dc62cbbfd503c368f00000e& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&zheye.org/asks/4dc62cbb&/span&&span class=&invisible&&fd503c368f00000e&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&ul&&li&不按Esc而是按^[或者^c,速度快很多&br&&/li&&li&学会几个定位键的区别:0, $, {, }, g, G, w, e, b...&/li&&li&o, O分别是当前位置下面/上面插入一个新行并进入插入状态&/li&&li&Shift+V选定几行,然后用
一起移动&/li&&li&Ctrl+V选定行首或行尾的字符,然后用shift+i做插入,或者shift+x做删除&/li&&li&学会用y,d 和p, P做粘贴剪切&/li&&li&学会用^W的窗口操作。打开文件用sp或者vs&/li&&li&学会记录宏的命令。用q加任意键开始录制,再按q保存。然后可用@加这个任意键回放,在@前加数字可定义回放次数。&/li&&li&&.&重复上一个命令,&u&取消上一个命令,&^r&反取消&/li&&li&^n, ^p用buf里的关键词补全。&/li&&li&学会搜索替换&:%s/要搜的东西/要换成的东西/g&&/li&&li&任何时候移到一个单词上按#的话可以高亮这个文档里所有一样的单词&/li&&li&用“/”做搜索, 按n或N 上一个/下一个&/li&&li&&:!命令 &&可直接运行这个命令,用&:!命令 %&&如果你想让这个命令对当前所编辑文件做操作。&/li&&li&任何时候可用&:cd %:p:h&来切换目录到当前编辑文件所在目录。&/li&&/ul&&br&&br&剩下的我想起来再补充
Vim上真正牛逼的地方不是代码补全提示功能这些功能(我不知道有没有提示,但是补全功能很多),而是快速定位,快速把想要的代码格式化。 我主要是在格式上配置了一些插件和设定。编译和调试还没有弄。下面所说的都是linux系统上的设定,win下有些地方不一样…
谁说不支持了?自己实现个简易的 multiple dispatch 不就完了。Guido 七年前就给了范例了 [1]。同学们要多读书,不要随便被问题挖的坑给埋了……&br&&br&静态语言需要 function overloading 主要是为了解决调用灵活性的问题,Python 这么灵活的脚本语言用 function overloading 纯属多此一举。&br&&br&[1]: &a href=&///?target=http%3A///weblogs/viewpost.jsp%3Fthread%3D101605& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/weblogs/view&/span&&span class=&invisible&&post.jsp?thread=101605&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
谁说不支持了?自己实现个简易的 multiple dispatch 不就完了。Guido 七年前就给了范例了 [1]。同学们要多读书,不要随便被问题挖的坑给埋了…… 静态语言需要 function overloading 主要是为了解决调用灵活性的问题,Python 这么灵活的脚本语言用 function…
这个问题,最近在 cpyug 上面讨论得很火热。我简要概括一下。&br&&br&为了考虑为什么 python 不提供函数重载,首先我们要研究为什么需要提供函数重载。&br&&br&函数重载主要是为了解决两个问题。&br&1。可变参数类型。&br&2。可变参数个数。&br&&br&另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。&br&&br&好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。&br&&br&那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。&br&&br&好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。
这个问题,最近在 cpyug 上面讨论得很火热。我简要概括一下。 为了考虑为什么 python 不提供函数重载,首先我们要研究为什么需要提供函数重载。 函数重载主要是为了解决两个问题。 1。可变参数类型。 2。可变参数个数。 另外,一个基本的设计原则是,仅仅当…
谢邀。看到邀请已经很久了,一直没敢回答,主要是我自己没有读过多少模块的源码,因为我一直认为读源码是一种比较“低效”的学习方法。我用 yolk -al 看了一下安装的模块,发现居然也没有几个算是“读过”的。web.py 的读过一点,它的接口很 pythonic,但这货的实现应该算不上是非常 pythonic 的代码。&br&&br&如果一定要推荐一些 python 的源码去读,我的建议是标准库里关于网络的代码。从 SocketServer 开始,补上 socket 模块的知识,熟悉 TCP/UDP 编程,然后了解 Mixin 机制的最佳示例 SocketServer.{ForkingMixIn|ThreadingMixIn},借这个机会了解 thread/threading 模块,这时会对并发量提出新的要求,就可以读 select 模块,开始对 select/{epoll|kqueue} 有深刻理解,搞懂以后就可以接触一下异步框架 asyncore 和 asynchat。这时开始出现分岔。如果是做 game 等以 TCP/UDP 协议为基础的应用,可以去读 greenlet 和 gevent,如果是做 web,则走下一条路。&br&&br&做 web,读 BaseHTTPServer、SimpleHTTPServer 和 CGIHTTPServer,读 cgi/cgitb,自己随意写框架,读cookielib,读 wsgiref,这时候自己写一个简便的 web framework 就 so easy 了,老板再也不担心你写 web 了,选择 flask/web.py/django/pyramid 都心中有数了。因为走的是 web 的路,所以难免要调用一下别人的 api,搞懂一下 httplib/urllib/urllib/urlparse。&br&&br&最后,上述提到的标准库,我大多读过。
谢邀。看到邀请已经很久了,一直没敢回答,主要是我自己没有读过多少模块的源码,因为我一直认为读源码是一种比较“低效”的学习方法。我用 yolk -al 看了一下安装的模块,发现居然也没有几个算是“读过”的。web.py 的读过一点,它的接口很 pythonic,但这…
首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var 这样的形式访问到这样的对象。&br&&br&在 Python 的官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和 Python 关键词区分开来,比如如果我们需要一个变量叫做 class,但 class 是 Python 的关键词,就可以以单下划线结尾写作 class_。&br&&br&双下划线开头的命名形式在 Python 的类成员中使用表示名字改编 (Name Mangling),即如果有一 Test 类里有一成员 __x,那么 dir(Test) 时会看到 _Test__x 而非 __x。这是为了避免该成员的名称与子类中的名称冲突。但要注意这要求该名称末尾没有下划线。&br&&br&双下划线开头双下划线结尾的是一些 Python 的“魔术”对象,如类成员的 __init__、__del__、__add__、__getitem__ 等,以及全局的 __file__、__name__ 等。 Python 官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。&br&&br&另外单下划线开头还有一种一般不会用到的情况在于使用一个 C 编写的扩展库有时会用下划线开头命名,然后使用一个去掉下划线的 Python 模块进行包装。如 struct 这个模块实际上是 C 模块 _struct 的一个 Python 包装。&br&&br&更多关于命名的内容可以参考 PEP 8 《代码风格指南》的 Name Conventions 一节:&a href=&///?target=http%3A//www.python.org/dev/peps/pep-0008/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&python.org/dev/peps/pep&/span&&span class=&invisible&&-0008/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&需要说明的是,由于这份文档看起来经过多次修改,双下划线开头的用法似乎曾经如 @makestory 所说,建议为类的私有成员,至少啄木鸟社区的 PEP 8 译文是这样写的,但 PEP 8 当前的官方版本中并没有体现。&br&&br&啄木鸟的译文参考:&a href=&///?target=http%3A//wiki./moin/PythonCodingRule& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&wiki./&/span&&span class=&invisible&&moin/PythonCodingRule&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&另找到一份较新的译文参考:&a href=&///?target=http%3A///p/zhong-wiki/wiki/PEP8& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/p/zhong&/span&&span class=&invisible&&-wiki/wiki/PEP8&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_mo…
这篇PEP阐述了拒绝的原因 &a href=&///?target=http%3A//www.python.org/dev/peps/pep-3128/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&python.org/dev/peps/pep&/span&&span class=&invisible&&-3128/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
这篇PEP阐述了拒绝的原因
我认为「精通」要满足如下条件:&br&&ol&&li&熟知主流硬件体系(x86, x64)&/li&&li&熟知 CPython 的具体实现,如若可能至少通读源码三遍以上&br&&/li&&li&熟知每条 Python bytecode 如何被解释执行&br&&/li&&li&熟知每条 Python 语句如何 compile 成 bytecode&br&&/li&&li&熟知 Python 主要数据结构所采用的优化手段&/li&&li&熟知 JIT 以及哪些场合下 PyPy 会比 CPython 有较大性能提高、以及有什么代价&/li&&/ol&&br&所以我一直只敢称自己为 「中级 Pythonista」。对于那些仅仅知道怎么用 Python 就敢自称「精通」的人:专家不是那么好当的,没有金刚钻别揽瓷器活。不懂那么多底层细节就不要随便说自己「精通」,说自己「擅长」不会被人看不起。&br&&br&@米嘉 引用的 StackOverflow 上列的那几项条件是作为将 Python 用于主要工作语言所需要的&u&&b&基本条件&/b&&/u&,敢于因此而称自己「精通 Python」要让不少人笑掉大牙。况且那几项还有几个严重问题:&br&&ul&&li&第3点:如若可能,尽量避免 map/reduce/fitler,而用 list/generator/set comprehension,代码要清晰得多,GvR 如此说。xrange 和 range 的区别在 Python 3 中马上就要滚蛋了,所以如非必要,&u&&b&不要大量使用 xrange。&/b&&/u&&/li&&li&第5点:敢于在 CPython 中大量使用递归是对 CPython 实现的公然侮辱。Python 的多个稳定实现都没有 TCO,递归会让性能迅速下降。记住一点:Python 中函数调用&u&&b&非常&/b&&/u&昂贵,可读性、可维护性影响不大的情况下,能展开函数调用的时候尽量展开、递归能转化成循环的尽量转化。递归也不是人类自然的思考方式。&/li&&li&第7点:看书是对的,但不要把 Python 当作一门经典函数式语言对待,因为它不是。你当它是,它会很痛苦(“为毛要这样滥用我!?”),你也会很痛苦(“为毛你不这样实现 blah blah!?”)。SICP 是本好书,但不要因此而教条。要清楚的知道什么时候用函数式,什么时候用面向对象,什么时候用面向过程,什么时候用面向任务,什么时候用面向结果。&u&&b&在一棵树上吊死是大多数非理性死忠的表现。&/b&&/u&&/li&&/ul&
我认为「精通」要满足如下条件: 熟知主流硬件体系(x86, x64)熟知 CPython 的具体实现,如若可能至少通读源码三遍以上 熟知每条 Python bytecode 如何被解释执行 熟知每条 Python 语句如何 compile 成 bytecode 熟知 Python 主要数据结构所采用的优化手段…
已有帐号?
无法登录?
社交帐号登录
3612 人关注
703 条内容
16672 人关注
350 条内容
4058 人关注
2133 条内容
29074 人关注
547 条内容

我要回帖

更多关于 函数重载的条件 的文章

 

随机推荐