据说和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
实线表示子类与父类关系,虚线表示类与实例的关系。
javascript
红线表示隐含[[prototype]]所指。
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'