设为首页 收藏本站
查看: 1092|回复: 0

[经验分享] 补发:澄清Python的Open class

[复制链接]
发表于 2017-4-28 09:16:50 | 显示全部楼层 |阅读模式
在这里对我在Why not python?这帖子中的一些错误的看法进行澄清,避免造成误导。
那个帖子地址为http://www.iteye.com/topic/33665?page=1
下面我把帖子大概描述一下:
首先:
suninny 写道
要是Python也具备Closure(Block)的话我绝不会多瞧下Ruby。

接着:
qiezi 写道

我倒觉得相比起ruby来,python只能算是中规中矩,没多少出彩的地方。
ruby我认为最强的地方是可以open一个类,扩充它。另一个强的地方是关键字,ruby的关键字很少,而且很多关键字可以当成方法名来用,限制很少,只要你愿意,可以随意地扩充ruby,把它看成是语言的一部分。


接着
geradle 写道

Python也具有Open Class 的特色的呀,你也可以实现这样的功能的。

class openclass():   
def test():   
print "test"  
open = openclass()   
open.test()   
def test1():   
print "test1"  
open.test=test1   
open.test()   

还有那个method missing,python也有的。


最后
charon 写道

geradle的那个代码更多的是open object methods的功能,而且不像是python的代码,方法的第一个不是self啊
python在open class和open object methods的实现上有非常微妙的差别,主要就是这个self引起的。针对class的修改是含self的(需要声明,但调用时不需要给出,解释器自动添加这个参数),并且影响到这个类所有的对象(包括以前生成的);对object的属性的赋值是不带self的(解释器不会自动添加self参数),并且只影响到被修改的对象。
我估计和ruby的区别主要是python中function是first class造成的,而方法是函数的一个特例,从而产生绑定和非绑定的区别。但仔细思考之后,发现这个处理方式是自洽的


正是Charon的回复,让我觉得认真的学习一下Python method调用时候的是如何查找method的。结果不看不知道,一看下一跳,原来我原来关于python open class的想法是错误的。为什么是错误的呢?
先看看Ruby的Open class是怎么实现的。引用

Reading further on Ruby's object-oriented features, I found out in Programming Ruby that:
Classes are never closed: you can always add methods to an existing class. This applies to the classes you write as well as the standard, built-in classes. All you have to do is open up a class definition for an existing class, and the new contents you specify will be added to whatever's there.
As a conseguence, you can always revise a method (changing its semantics) to an existing class no matter where you are. For instance, let consider the following example.


可以看出Ruby的Open Class是基于声明的。你在类定义的时候就改变了其方法或者Attribute的sematic.
然而Python中是在运行时改变的,应该不能成为Open class或者可以叫做Open object:).当然这个称呼是不恰当的。或许有人会居然python可以实现和ruby Open Class一样的功能,为何还要在乎概念呢。
有两个理由:

    Python中实现类似于Ruby Open Class的功能其实是Python把Function做为一等公民的另外一种表现,而不是所谓的Open Class.
    为了介绍Python中Method与Function的差别,那样就可以更好的说明Charon前面试图说明的东西。

Python的Instance Object包含了data attributes  & methods, data attributes好理解,那么Methods呢?Methods是该实例变量的类中定义的Functions.为什么要要强调这个呢?因为在Method和Function的调用过程中存在着以下差别。当你调用Function的时候,Function接受的参数就是你传递的参数。而当你调用Method的时候,实际参数是你传入的参数和instance object的引用,示例代码如下:

>>>class method():
def test(self):
print "method"
>>> m = method()
>>> m.test
<bound method method.test of <__main__.method instance at 0x00B43BC0>>
>>> m.test()
method
>>> method.test
<unbound method method.test>
>>> method.test(m)
method
>>>

下面再列举一段代码说明Method与Function的差别:

>>> def test1():
print "test1"
>>> test1
<function test1 at 0x00B2FCF0>
>>> m.test=test1
>>> m.test
<function test1 at 0x00B2FCF0>
>>> m.test()
test1
>>> method.test(m)
method
>>>

为什么上面的m.test()没有出错呢,难得前面提到的Method调用是参数传递规则不对?上面的规则是对的,没有出错因为此处的m.test()调用不是Method的调用,而是Function的调用。
为什么说此处是Function的调用而不是Method的调用呢?
因为在m.test=test1执行的时候,我们实际上是为instance object m创造了一个data attribute,并把他赋值为function test1.所以m.test()实际为Function的调用!
这里还关系到一个python的Method/Function的调用规则:当你通过instance object调用函数或者方法时,Python首先搜索该object的data attribute,再搜索其Class,base class。所以此处为Function调用!这个规则可以参看一篇文章http://www.informit.com/articles/article.asp?p=28672&seqNum=4&rl=1

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370201-1-1.html 上篇帖子: 二Python内置数据类型 下篇帖子: python递归层次的RuntimeError
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表