1.使用new方法
|
|
特殊方法new是一个元构造程序,每当一个对象必须被factory类实例化时就将调用它
new方法必须返回一个类的实例,因此它可以在对象创建之前或之后修改类
因为init在子类中不会被隐式调用,所以new可以用来确定已经在整个类层次完成了初始化构造
new是对于对象状态隐式初始化需求的回应,使得可以在比init更低的一个层次上定义一个初始化,这个初始化总是会被调用
与init()相比new()方法更像一个真正的构造器。随着类和类型的统一,用户可以对内建类型进行派生,因此需要一种途径来实例化不可变对象,比如派生字符串,在这种情况下解释器则调用类的new()方法,一个静态方法,并且传入的参数是在类实例化操作时生成的。new()会调用父类的new()来创建对象(向上代理)
new必须返回一个合法的实例,这样解释器在调用init()时,就可以吧这个实例作为self传给他。调用父类的new()来创建对象,正如其他语言使用new关键字一样
ps.
1.new是一个静态方法,而init是一个实例方法.
2.new方法会返回一个创建的实例,而init什么都不返回.
3.只有在new返回一个cls的实例时后面的init才能被调用.
4.当创建一个新实例时调用new,初始化一个实例时用init.
metaclass是创建类时起作用.所以我们可以分别使用metaclass,new和init来分别在类创建,实例创建和实例初始化的时候做一些小手脚.
2.装饰器版本
|
|
3.共享属性
创建实例时把所有实例的dict指向同一个字典,这样它们具有相同的属性和方法.
但是创建的是两个不同的实例,共享一样的属性
4.另一种方法,通过代表的形式,使用递归的方式建立子类
|
|