metaclass

  • 类由Type创建
  • 对象由创建

MetaClass作用

用来指定当前类由谁来创建(默认type创建)。

MetaClass 会被继承,如果父类指定了元类,那么子类也是由这个元类创建

class MyType(type):
def __init__(self, *args, **kwargs):
print('init')
super(MyType, self).__init__(*args, **kwargs) def __call__(self, *args, **kwargs):
print('call本质:调用类的__new__,再调用类的__init__')
return super(MyType, self).__call__(*args, **kwargs) class Foo(metaclass=MyType):
pass class Bar(Foo):
pass obj = Bar() # init
# init
# call本质:调用类的__new__,再调用类的__init__

  

1. 创建类的两种方法

#class创建

class Foo(object):
pass #type创建 #运用type创建类、添加属性
# type(类名,(继承的类),{属性和方法,用键值对的方式})
Test = type("Test",(),{'age':13,'name':"wangbo"})
test = Test()
print(test.age) #
#利用type添加方法
@classmethod #类方法
def testClass(cls):
print(cls.name) @staticmethod #静态方法
def testStatic():
print("static method.....") def echo_age(self):
print(self.age)
#
Test2 = type("Test2",(Test,),{'echo_age':echo_age,'testStatic':testStatic,'testClass':testClass})
test2 = Test2()
test2.echo_age()
test2.testStatic()
test2.testClass()

2. 调用顺序

class MyType(type):
def __init__(self, *args, **kwargs):
print("元类init")
super(MyType, self).__init__(*args, **kwargs) def __new__(cls, *args, **kwargs):
print("new")
return super().__new__(cls, *args, **kwargs) def __call__(self, *args, **kwargs):
print("call")
obj = self.__new__(self, *args, **kwargs) # object.__init__(....)
obj.__init__(*args, **kwargs)
# self.__init__(obj,*args, **kwargs)
return obj class Foo(object, metaclass=MyType):
def __init__(self):
print('本类init') x = Foo() # new
# 元类init
# call
# 本类init # 调用顺序:创建一个类调时候先调用他元类的__new__,然后元类的__init__,实例化这个类的时候调用元类的__call__,
# 在__call__中调用这个类的__new__然后__init__得到一个对象
# 类是Mytype的对象,实例化时加括号调用__call__

3. 设置元类

py3
class Foo(object,metaclass=MyType):
pass py2
class Foo(object):
__metaclass__ = MyType

元类 metaclass的更多相关文章

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

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

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

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

  3. Python中的元类(metaclass)

    推荐+收藏:深刻理解Python中的元类(metaclass) 做一些笔记学习学习: 在大多数编程语言中,类就是用来描述如何生成一个对象的代码段,在Python中类也是一个对象,这个(类)对象自身拥有 ...

  4. [转] 深刻理解Python中的元类(metaclass)

    非常详细的一篇深入讲解Python中metaclass的文章,感谢伯乐在线-bigship翻译及作者,转载收藏. 本文由 伯乐在线 - bigship 翻译.未经许可,禁止转载!英文出处:stacko ...

  5. [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式

    使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...

  6. 深刻理解Python中的元类(metaclass)【转】

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

  7. 深入理解Python中的元类(metaclass)

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

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

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

  9. python中的元类metaclass

    本文是一个转载的,因为原文写的太好了,所以直接copy过来吧. 原文请看:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上 很热的帖子.提问 ...

  10. 谈谈Python中元类Metaclass(二):ORM实践

    什么是ORM? ORM的英文全称是“Object Relational Mapping”,即对象-关系映射,从字面上直接理解,就是把“关系”给“对象”化. 对应到数据库,我们知道关系数据库(例如Mys ...

随机推荐

  1. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  2. hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  3. Microsoft Word、Excel、PowerPoint转Pdf

    Worksheet.ExportAsFixedFormat Method Mark: The ExportAsFixedFormat method is used to publish a workb ...

  4. Ubuntu 编译安装搭配LNMP 环境

    这里用Nginx1.2.0+mysql5.6.33+php5.6.2搭配安装环境 ---------------------------------------------Nginx BEGIN--- ...

  5. Keil调试程序如何查看变量

    第一个问题:调试时候想实时查看某一变量变化? view 菜单下的 watch windows,全局变量才能查看 比如要查看u8 adcx的值变化,如下: 全速运行后,如下: 无法查看!什么问题? 该变 ...

  6. jquery 判断ul下是否存在li

    $("ul").has("li").length > 0;$("ul > li").length > 0;$(" ...

  7. 设置eclipse中python脚本的编码格式

    今天在运行python脚本时报如下错误: SyntaxError: Non-ASCII character '\xe5' in file D:\pythonlearn1\src\day01\direc ...

  8. jquery对象转dom对象

    jq取兄弟级的上移个元素 jquery对象: var a = $(this).prev("a"); console.log(a); 输出: 转dom对象: var a = $(th ...

  9. 在JavaWeb项目中处理静态文件或动态链接拼接网站地址的最优处理方案

    在开发网站时候我们会遇到下面问题? - 在引用网页中引用js和css或者动态的Servlet的时候我们是写绝对路径还是相对路径? - 如果写相对路径吧,上线偶尔会报404,还要手动去拼接绝对路径 - ...

  10. 170317、到底什么时候该使用MQ?

    一.缘起 一切脱离业务的架构设计与新技术引入都是耍流氓. 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题. 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什么问 ...