元类type

1. 创建类的两种方式 (都是由type元类创建)

方式一:

class Foo(object):      # 默认metaclass = type, 当前类, 由type类创建
a = 'aaa'
def func(self, x):
return x + 1

方式二:

Foo = type("Foo", (object, ), {'a': "aaa", 'func': lambda self, x: x + 1})

metaclass

作用:
  通过metaclass可以指定当前类由哪一个元类创建

python2和python3的区别:

    python3:
class Foo(object, metaclass=type):
pass python2:
class Foo(object):
__metaclass__=type
pass

自定义元类

1、第一步

class MyType(type):
def __init__(self, *args, **kwargs):
print("创建类之前")
super(MyType, self).__init__(*args, **kwargs)
print("创建类之后")

2、第二步

class Base(object, metaclass=MyType):
pass

Base = MyType('Base', (object, ), {})

这两部代码写完后,执行:

输出:

  创建类之前
  创建类之后

因为:  代码一执行, 就创建一个类,由MyType创建Foo类,就执行Mytype的__init__方法了

3、第三步

class Foo(Base):         # 基类由MyType创建,Bar也由MyType创建
a = 'aaa' def func(self, x):
return x + 1

现在有3个类, 运行脚本,会打印2遍("创建类之前","创建类之后")

元类__new__/__init__/__call__的执行顺序

class MyType(type):
def __init__(self, *args, **kwargs):
print("MyType: __init__")
super(MyType, self).__init__(*args, **kwargs) def __call__(self, *args, **kwargs):
print('MyType: __call__')
super(MyType, self).__call__(*args, **kwargs) def with_metaclass(arg):
return MyType('Base', (arg,), {}) class Foo(with_metaclass(object)):
a = 'aaa' def __init__(self, *args, **kwargs):
print('Foo: __init__')
super(Foo, self).__init__(*args, **kwargs) def __new__(cls, *args, **kwargs):
print('Foo: __new__')
return super(Foo, cls).__new__(cls) def func(self, x):
return x + 1 b = Foo() # MyType: __init__ 这个是创建Base类的时候执行MyType的__init__
# MyType: __init__ 创建Foo类的时候,执行MyType的__init__
# MyType: __call__ 实例化 Foo(), 先执行MyType的__call__, 再执行Foo的__new__和__init__
# Foo: __new__ 然后才会执行Foo的__new__方法
# Foo: __init__     最后执行Foo的__init__方法

总结:
  1. 默认类由type实例化创建。
  2. 某个类指定metaclass=MyType,那么当前类及所有派生类都由于MyType创建。
  3. 实例化对象
    - type.__init__

    - type.__call__
    - 类.__new__
    - 类.__init__

type和metaclass元类的更多相关文章

  1. python——type()、metaclass元类和精简ORM框架

    1.type()函数 if __name__ == '__main__': h = hello() h.hello() print(type(hello)) print(type(h)) Hello, ...

  2. metaclass元类解析

    一.创建类的流程 二.什么是元类 在Python3中继承type的就是元类 示例 # 方式一 class MyType(type): '''继承type的就是元类''' def __init__(se ...

  3. Python - metaclass元类

    参考 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319106919 ...

  4. Python - metaclass元类(图)

    个人总结

  5. Python面向对象篇之元类,附Django Model核心原理

    关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...

  6. python 元类 type metaclass

    python中一切皆对象,类对象创建实例对象,元类创建类对象,元类创建元类. 元类创建类对象有2中方式: 一.type方法 type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性 ...

  7. Python面向对象 -- slots, @property、多重继承MixIn、定制类(str, iter, getitem, getattr, call, callable函数,可调用对象)、元类(type, metaclass)

    面向对象设计中最基础的3个概念:数据封装.继承和多态 动态给class增加功能 正常情况下,当定义了一个class,然后创建了一个class的实例后,可以在程序运行的过程中给该实例绑定任何属性和方法, ...

  8. 深刻理解Python中的元类metaclass(转)

    本文由 伯乐在线 - bigship 翻译 英文出处:stackoverflow 译文:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热 ...

  9. 深刻理解Python中的元类(metaclass)

    译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...

随机推荐

  1. BOM学习-javascript计时器小结

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. JS编写自己的富文本编辑器

    富文本编辑器,网上有很多功能齐全种类丰富的如百度的Ueditor,简单适用型的如WangEditor等等.在经过一番挑选后,我发现都不适用现在的项目,然后决定自己造轮子玩玩.富文本编辑器中主要涉及到J ...

  3. java实现网络监听

    Java实现网络监听 import java.net.*; import java.io.*; public class tcpServer { public static void main(Str ...

  4. IOS的水滴文件效果

    @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; NSDictionary *dict = [NSDic ...

  5. 语音行业技术领先者Nuance诚招ASR/NLP研发工程师和软件工程师

    Nuance is a leading provider of voice and language solutions for businesses and consumers around the ...

  6. Android(java)学习笔记180:多媒体之图形的变化处理

    1. 图形的缩放 (1)布局文件activity_main.xml如下: <LinearLayout xmlns:android="http://schemas.android.com ...

  7. TebsorFlow低阶API(五)—— 保存和恢复

    简介 tf.train.Saver 类提供了保存和恢复模型的方法.通过 tf.saved_model.simple_save 函数可以轻松地保存适合投入使用的模型.Estimator会自动保存和恢复 ...

  8. easyUI-datagrid属性设置display:none,表头不显示

    <div class="box1"> <div class="dg1Box" style="margin-top:15px; mar ...

  9. activiti工作流学习链接

    首页: http://www.activiti.org/书籍: activiti in action  入门demo: kft-activiti-demo   http://www.oschina.n ...

  10. Linux文件属性和压缩解压

    目 录 第1章 Linux系统文件的属性    1 1.1 命令ls    1 1.2 inode    2 1.3 文件属性    2 1.4 env命令    2 1.5 注意:    2 第2章 ...