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

[经验分享] 比较javascript学python-1 对象与类

[复制链接]

尚未签到

发表于 2017-5-4 07:06:15 | 显示全部楼层 |阅读模式
  据说和javascript最像的是python,学习ing,理解动态语言精粹


  


  


  0.python首先注意经典类与新类的区别,建议以后只用新类



经典类





class C:
pass
  新类





class C(object):
pass
   
1.都内置基本类型 int string等,但有所不同



javascript 中



1.constructor 会生成临时对象

但是 python全是对象



1.__class__ 1本来就是对象,根据源码剖析解释,小整数还进行了缓存。



2.动态弱类型语言,接口没有意义,但是继承很有用



  语言级别实现oop,可以进行多继承,注意经典的棱形基类函数查找顺序(广度优先)




class c(p1,p2):
pass
   javascript 由于使用原型链实现继承,只能实现链状单继承




//extjs extend mechanism
Ext.extend(c,p1);
   3.相似的调用父类函数做法



python:




class p1(object):
def pm(self):
pass
class c(p1):
def pm(self):
//语言级别支持:super(p1,self).pm();
p1.pm(self)
   

javascript:





function p1(){
}
p1.prototype.pm=function(){}
function c(){}
Ext.extend(c,p1,{
pm:function(){
//自己实现: c.superclass.pm.apply(this);
p1.prototype.pm.apply(this);
}
});
   

4.属性设置




都可以在实例上自由设置任意属性,但是读取区别

python


  如果实例不存在属性,直接 obj.x会抛出异常,最好用hasattr判断,或者getattr指定默认参数



5.类型与对象模型(Object Model)




python


  实线表示子类与父类关系,虚线表示类与实例的关系。

DSC0000.png

  
javascript


  红线表示隐含[[prototype]]所指。

DSC0001.jpg

  PS. JAVA 也类似,只不过 Class 作为元类(meta class)



Class z=Object.class ;
Class b=z.getClass();
Class v=b.getClass();
Class v2=Class.class;
System.out.println(z instanceof Class);
System.out.println(v2 instanceof Class);
System.out.println(v2 instanceof Object);
  可认为 Class 的 class 属性是一开始设置好德,一个自循环数据结构:

Class.class=new Class("java.lang.class");
Object.class=new Class("java.lang.object");
// 所有class继承于 Object,包括 Class
// 所有 class 都是 Class 的实例
// java 不行
// Object instanceof Class
// 相当于
Object.class instanceof Class

   6.类特殊函数:




python __str__ 对应 javascript toString ,并且python存在更细化的__repr__



python对属性有更多的控制,比如 property函数以及__get__,__set__,__getattribute__等强大的数据描述符可以控制对实例属性的读写(YUI3也构建了类似的Attribute.js)。


举个property以及修饰器的强大例子




def Property(f):  
obj = f()
fdoc = f.__doc__
return property(obj['fget'], obj['fset'], obj['fdel'], fdoc)

class HideX(object):
def __init__(self, x):
self.x = x
@Property
def x():        
def fget(self):
return ~self.__x
def fset(self, x):
assert isinstance(x, int), \
'"x" must be an integer!'
self.__x = ~x
def fdel(self,x):
pass   
return locals()
if(__name__=='__main__'):   
y=HideX(10);
print y.x
y.x='z'

运维网声明 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-372677-1-1.html 上篇帖子: SyntaxError: Non-ASCII character Python、Unicode和中文 下篇帖子: Python: 50个能够满足所有需要的模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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