python进阶之python三叉戟new init call
灵活使用三大方法,将思路扩宽
先来介绍new,若想了解更深层次原理后续介绍,此文只讲述new的实现方法。更关注如何灵活使用。
使用说明:1)new在init前使用
2)任何一个类中都有new 若没有也可以使用,因为他们的父类或更上多层中type有new方法。
3)type中的new方法 最终是使用万物类object.new来创建即将生成的类的实例。
谈到这里说明,python起源是在有意的模仿万物起源。从而使得程序真正的能够自我进化,但是作者可能发现用程序模拟万物的思路正确但是中间可能少了一些关键的不为人知的认知科学,没有用程序语言模拟,所以产生了现在的使用非常灵活的一种语言。 也或许作者就是想创造一种能够让人类可以和计算机交流更加方便简明的语言。
{事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时 ,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写 __new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
而如果新式类中重写了__new__()方法,那么你可以自由选择任意一个的其他的新式类(必定要是 新式类,只有新式类必定都有__new__(),因为所有新式类都是object的后代,而经典类则没有__new__() 方法)的__new__()方法来制造实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死 循环。具体看以下代码解释:
class Foo(object):
def __init__(self, *args, **kwargs):
...
def __new__(cls, *args, **kwargs):
return object.__new__(cls, *args, **kwargs)
# 以上return等同于
# return object.__new__(Foo, *args, **kwargs)
# return Stranger.__new__(cls, *args, **kwargs)
# return Child.__new__(cls, *args, **kwargs) } 可以不用关注
注意这个模拟环境
寄养环境
1 class Foo(object): 2 def __init__(self, *args, **kwargs): 3 self.name = '0000000000000' 4 print 'Foo,init' 5 def __new__(cls, *args, **kwargs): 6 print 'Foo,new' 7 return object.__new__(Stranger, *args, **kwargs) 8 9 class Stranger(Foo): 10 11 def __init__(self): 12 super(Stranger ,self).__init__() 13 self.age = 18 14 print 'stranger init' 15 def aa(self): 16 print 'Stranger aa' 17 18 19 foo = Foo() 20 print type(foo) 21 print foo.age 22 23 print foo.name 24 print foo.aa()
foo 是 Stranger的实例,虽然它是Foo来触发创建,但是放在Stranger来维护和执行动作。如果s不主动继承F,那么寄养的这个实例是没有F的属性和遗传行为的。
浙公网安备 33010602011771号