[python's object model]
1、object.__init__(self[, ...])
如果subclass没有实现__init__,那么python类在实例化的时候,显然会调用到父ClassObject的__init__,所以在subclass没实现__init__的时候,对象可以正常实现继承特性。
如果subclass实现了__init__,但是没有调用super的__init__,则父类实例中的变量在子类实例中不会存在,因为没有执行父ClassObject的__init__,所以无法正常实现继承特性。
If a base class has an __init__() method, the derived class’s __init__() method, if any, must explicitly call it to ensure proper initialization of the base class part of the instance; for example: BaseClass.__init__(self, [args...])
需使用super来调用继承链上下一个__init__。
2、class.__mro__, class.mro(),MethodResolutionOrder
class.mro()是C3算法的实现,class.__mro__包含C3算法的結果。
从python2.3起C3算法用于检测多重继承中是否存在环,即A->B,B->A的情况,若存在则runtime错误。显然在C3算法的保证下,python2.3起多重继承序并不是深度优先,也不是广度优先。而是一种深度优先的拓扑排序。
C3算法参考:http://blog.sina.com.cn/s/blog_45ac0d0a01018488.html
3、super()函数按照C3算法生成的mro来选择后继类,即当前类后面的类对象中寻找。
super参考:http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html
4. getattr(object, name[, default])
Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object’s attributes, the result is the value of that attribute. For example, getattr(x, 'foobar') is equivalent to x.foobar. If the named attribute does not exist, default is returned if provided, otherwise AttributeError is raised.
5、hasattr(object, name)
The arguments are an object and a string. The result is True if the string is the name of one of the object’s attributes, False if not. (This is implemented by calling getattr(object, name) and seeing whether it raises an exception or not.)
6、None
None是一个特殊的常量。None和False不同。None不是0。None不是空字符串。None和任何其他的数据类型比较永远返回False。None有自己的数据类型NoneType。你可以将None复制给任何变量,但是你不能创建其他NoneType对象。
参考:http://eriol.iteye.com/blog/1319295
7、object.__call__(self[, args...])
Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, ...) is a shorthand for x.__call__(arg1, arg2, ...).
Class instances are callable only when the class has a __call__() method; x(arguments) is a shorthand for x.__call__(arguments).
8、所有的instance.__class__指向自己的Class Type,所有class.__class__指向type对象。
测试程序: 输出为:
可见所有class.__class__指向都一样
9、type(object) & type(name, bases, dict)
With one argument, return the type of an object. The return value is a type object. The isinstance() built-in function is recommended for testing the type of an object.
With three arguments, return a new type object. This is essentially a dynamic form of the class statement. The name string is the class name and becomes the __name__ attribute; the bases tuple itemizes the base classes and becomes the __bases__ attribute; and the dict dictionary is the namespace containing definitions for class body and becomes the __dict__ attribute.
10、type & object, type、object是python对象模型的两大基石,
1)type(object)函数是根据 instace.__class__.来判断类型,该对象的__name__即为类名
1)使用def class: body 定义的方法,均保存在 ClassType的 __dict__中,当instance要调用时,是则ClassType的__dict__中找出来的。
2)方法(函数)只有三种:
1))function:如果在ClassType的__dict__中,通过instance调用时,为绑定方法。如果在instance的__dict__中,通过instance调用,则为非绑定方法。
2))classmethod:绑定了cls
3))staticmethod:永远不会绑定
3)可以给ClassType、instance动态添加方法、属性,但object()生成的instance无法添加。