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_attribute
foo
>>> 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)

posted on 2019-09-02 13:34  lexn  阅读(17)  评论(0)    收藏  举报

导航