python元类:type和metaclass

  • python中一切皆对象,所以类本身也是对象。类有创建对象的能力,那谁来创建类的呢?答案是type。

1.用tpye函数创建一个类

class A(object):
pass # 类名 = tpye(类名-str,父类-tuple,属性-dict)
#此条命令创建类相当于上个class创建类,效果是一样的。
B = type('B', (object,), {}) print(A)
print(B)

输出结果:

<class '__main__.A'>
<class '__main__.B'>
  • 有没有发现输出的结果是一样的。type创建出来的和class定义的都是类。

2.定义带有属性的类:

>>> class Foo(object):
… bar = True #相当于:
>>> Foo = type("Foo", (object), {'bar':True})

3.定义带有方法的类:

class Dog(object):
def bark(self):
print('wang wang ..') @classmethod
def eat(self):
print('i am eating...') # ----------------------------
# 上面创建的类可以用type实现,就相当于:
def bark(self):
print('wang wang ..') # @staticmethod也是这样用
@classmethod
def eat(self):
print('i am eating...') Dog = type('Dog', (object,), {'bark': bark, 'eat': eat}) # -----------------------------
# 来试验一下:
dog = Dog()
dog.eat()
dog.bark()

输出结果:

i am eating...
wang wang ..

4.__metaclass__自定义元类:

  • python3中:
def say_hello(self):
print('hello, I am ' + str(self)) def my_type(class_name, class_fathers, class_attr):
class_attr['say_hello'] = say_hello # 给属性列表中加入say_hello
return type(class_name, class_fathers, class_attr) class Foo(object, metaclass=my_type): # 用指定的元类来创建类(python3中需要这样用metaclass)
pass print(Foo) a = Foo()
print(a)
a.say_hello() # Foo对象拥有了say_hello的方法
  • python2中:
def say_hello(self):
print('hello, I am ' + str(self)) def my_type(class_name, class_fathers, class_attr):
class_attr['say_hello'] = say_hello # 给属性列表中加入say_hello
return type(class_name, class_fathers, class_attr) class Foo(object): # 用指定的元类来创建类
__metaclass__ = my_type # (python2中需要这样用metaclass) print(Foo) a = Foo()
print(a)
a.say_hello() # Foo对象拥有了say_hello的方法
  • metaclass可以用来给类做一些初始化(可以继承父类,没谁用这个)。其实metaclass一般情况下没什么用,但了解了总算是更加了解了python的底层。

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

  1. python 元类 type metaclass

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

  2. python 元类metaclass

    文章转自:http://www.cnblogs.com/linhaifeng/articles/8029564.html 一 知识储备 exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域 ...

  3. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  4. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  5. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

  6. python 元类的简单解释

    本文转自博客:http://www.cnblogs.com/piperck/p/5840443.html 作者:piperck python 类和元类(metaclass)的理解和简单运用 (一) p ...

  7. Python元类之由浅入深

    前言 ​ 元类属于python面向对象编程的深层次的魔法,非常重要,它使我们可以更好的掌控类从创建到消亡的整个生命周期过程.很多框架的源码中都使用到了元类.例如 Django Framework 中的 ...

  8. Python 元类 - Metaclasses

    Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...

  9. Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

随机推荐

  1. 线程同步API及它们的属性

    头文件:<pthread.h> 编译记得加 -lpthread库 1:互斥锁(mutex) 1.1:互斥锁API 数据类型:pthread_mutex_t // 初始化一个互斥锁 int ...

  2. java中Mysql开发

    [IntelliJ IDEA 12使用]导入外部包 http://www.cnblogs.com/haochuang/p/3491959.html JDBC导入包即可 http://blog.163. ...

  3. Linux iptables:规则原理和基础

    什么是iptables? iptables是Linux下功能强大的应用层防火墙工具,但了解其规则原理和基础后,配置起来也非常简单. 什么是Netfilter? 说到iptables必然提到Netfil ...

  4. nova-api源码分析(APP中用到的开源库)

    源码版本:H版 1.paste.deploy 参考文章: http://pythonpaste.org/deploy/ http://blog.csdn.net/xiangmin2587/articl ...

  5. time_t与GMT格式互转

    time_t Time::timeFromGMT(string gmt) { char week[4]; memset(week,0,4); char month[4]; memset(month,0 ...

  6. 海思HI35XX之----视频处理单元各通道间的关系

    最近在折腾HI3518C的芯片,应用到IPCamera上,最终获取多路不同分辨率的视频流供不同需求的预览切换.此处简单记录一下视频前处理元VPSS(Video Process Sub-System)的 ...

  7. Uva5211/POJ1873 The Fortified Forest 凸包

    LINK 题意:给出点集,每个点有个价值v和长度l,问把其中几个点取掉,用这几个点的长度能把剩下的点围住,要求剩下的点价值和最大,拿掉的点最少且剩余长度最长. 思路:1999WF中的水题.考虑到其点的 ...

  8. C语言易错点

    C语言易错点 1.每个C语言程序中main函数是有且只有一个的. 2.算法可以没有输入,但必须要有输出. 3.在函数中不可以再定义函数. 4.break可用于循环结构和switch语句. 5.brea ...

  9. 使用chardet判断编码方式

    1. chardet是什么 chardet是python中比较常用的一个编码方式检测库,需要注意的是它只检测并返回检测结果,并不负责对原数据做什么处理. 可以使用PIP命令安装: pip instal ...

  10. bzoj 2303 并查集

    首先如果没有限制的话,我们可以直接求出答案,假设对于n*m的矩阵,我们最上方一行和左方的一列随意确定,那么首先这写确定的状态肯定是不会不合法的,因为我们可以调整剩下的01状态来使得这一行一列的状态合法 ...