面向对象-元类
- 类对象
- 类对象的产生:在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立,但是,Python中的类还远不止如此。类同样也是一种对象,只要你使用关键字class,Python解释器在执行的时候就会创建一个类对象。
- 类对象的功能:
- 0.创建(实例对象的能力) “类的功能”
- 1.你可以将它赋值给一个变量 “对象的功能”
- 2. 你可以拷贝它 “对象的功能”
- 3. 你可以为它增加属性 “对象的功能”
- 4. 你可以将它作为函数参数进行传递 “对象的功能”
- 动态的创建类
- 动态创建类:
- 因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用class关键字即可。
- 1.比较low的方法
- 示例:
- 通过调用choose_class 可以实现动态的创建类,类似于实例创建的方法,但是这种方式还是不够动态;
- 2.type-创建类
- type的另外一种功能介绍:
- type可以接受一个类的描述作为参数,然后返回一个类。
- type创建类对象的格式:
- type(类名, 由父类名称组成的元组(可以为空),包含属性的字典(名称和值))
- 示例:
- 注意:属性可以添加类属性,也可以添加类方法和静态方法和类方法,通过使用装饰器@classmethod和@staticmethod
- 创建类幕后的事情
- 在Python中,类也是对象,你可以动态的创建类。这就是当你使用关键字class时Python在幕后做的事情,而这就是通过元类来实现的。
- 面向对象-元类
- 元类概念:
- 在python中了解到对象也是实例,所以实例也应该是由类创建出来的,创建类对象的类就被叫做元类;
- 通过元类创建出来的类叫做类对象,通过类对象创建出来的对象叫做实例对象
- type实际上就是一个元类,在创建类的时候,通过type的元类传入参数,创建出想要创建的额类
- Python中所有的东西,注意,我是指所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。(python中所有都是type创建出来的)
- __metaclass__属性:
- 应用场景:__metaclass__属性应用在需要定义一个元类的时候;
- 例如:
- __metclass__作用:
- 当python解释器在解释的时候,还没创建类对象之前,Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类,如果找到了就会用__metclass__定义的方法来创建类。
- 自定义元类的目的:
- 拦截类的创建,通过调用__metclass__指向的类,去执行对应的__new__方法(如果没有该属性则去执行type的__new__方法)
- 修改类
- 返回修改类的结果
- python解释器执行的步骤
- 比如当解释如下的代码时,python解释器做了如下的动作:
- 1.Foo中有__metaclass__这个属性吗?如果是,Python会通过__metaclass__创建一个名字为Foo的类
- (对象)
- 2. 如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做
- 和前面同样的操作。
- 3. 如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝
- 试做同样的操作。
- 4. 如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。
- 5.如果找到了__metclass__属性,那么按照__metaclass__定义的方法来创建类(__metaclass__中放置些什么代码呢:type,或者任何使用到type或者子类化type的东东都可以)
- 自定义元类的方法
- 应用到自定义元类的地方
- 在使用数据库编程的时候,经常用到自定义元类,叫做orm框架,通过创建出来orm对象来完成和数据库表的匹配,并通过对象来完成对数据库的操作;(以后会做进一步介绍) 附件有orm框架的源码