PPT_python_设计模式_高级
PPT_python_设计模式_高级
1、new基本原则
实例化开始之后,在调用 init()方法之前,Python首先调用new()方法:
def __new__(cls, *args, **kwargs):cls是当前正在实例化的类。
要得到当前类的实例,应当在当前类中的new()方法语句中调用当前类的父类 的new()方法。
def __new__(cls, *args, **kwargs):
...
return object.__new__(cls)
new()方法会返回cls(cls指代当前类)的实例,然后该类的 init()方法作为构造方法会接收这个实例(即self)作为自己的第一个参数,然后依次传入new ()方法中接收的位置参数和命名参数。
new()没有返回cls(即当前类)的实例,那么当前类的init()方法是不会被调用 的。如果new()返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个类的构造方 法。
总结:1、实例化开始之后,在调用 init()方法之前,Python首先调用new()方法:
2、def __new__(cls, *args, **kwargs):
...
return object.__new__(cls)
3、当前类中的new()方法语句中调用当前类的父类 的new()方法。cls是当前正在实例化的类。new()方法会返回cls(cls指代当前类)的实例,然后该类的 init()方法作为构造方法会接收这个实例(即self)作为自己的第一个参数
2、深入理解元类metaclass
类也是对象
Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。下面的代码段:
|
1
2
3
|
>>> class ObjectCreator(object):… pass… |
将在内存中创建一个对象,名字就是ObjectCreator。
这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是乎你可以对它做如下的操作:
1) 你可以将它赋值给一个变量
2) 你可以拷贝它
3) 你可以为它增加属性
4) 你可以将它作为函数参数进行传递
下面是示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
>>> print ObjectCreator # 你可以打印一个类,因为它其实也是一个对象>>> def echo(o):… print o…>>> echo(ObjectCreator) # 你可以将类做为参数传给函数>>> print hasattr(ObjectCreator, 'new_attribute')Fasle>>> ObjectCreator.new_attribute = 'foo' # 你可以为类增加属性>>> print hasattr(ObjectCreator, 'new_attribute')True>>> print ObjectCreator.new_attributefoo>>> ObjectCreatorMirror = ObjectCreator # 你可以将类赋值给一个变量>>> print ObjectCreatorMirror()<__main__.objectcreator object="" at="" 0x8997b4c=""> |
动态地创建类
因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用class关键字即可。
>>> def choose_class(name):
… if name == 'foo':… class Foo(object):… pass… return Foo # 返回的是类,不是类的实例… else:… class Bar(object):… pass… return Bar…>>> MyClass = choose_class('foo')>>> print MyClass # 函数返回的是类,不是类的实例>>> print MyClass() # 你可以通过这个类创建类实例,也就是对象<__main__.foo object="" at="" 0x89c6d4c="">深刻理解Python中的元类(metaclass)
链接 iphttp://%s.com/html/2015/pythonhexinbiancheng_0906/961.html %(www.pythontab)
浙公网安备 33010602011771号