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. vmvare安装ubuntu后

    配置源: http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8#Trusty.2814.04.29.E7.89.88.E6.9C.AC 清理工作: ...

  2. 解决SQL Server 2008 64位系统无法导入Access/Excel的问题

    最近更换了新服务器,操作系统Windows Server 2008 X64,数据库SQL Server 2008 X64,Office 2007(好像只有32位),在存储过程执行OpenDatasou ...

  3. 为VSCODE添加右键菜单

    参考:https://blog.csdn.net/GreekMrzzJ/article/details/82194913 1.创建一个名为vscode.reg的空文本文件,填入下列内容 Windows ...

  4. sqlserver 2008连接

    初次安装使用SQL server 2008时,可能会遇到无法连接到(local)的情况.那么,如何解决此问题?   工具/原料   SQL server 2008 方法/步骤   1 打开SQL se ...

  5. Debian最完美安装flash的教程//适用于所有linux版本

    话说不管是新手还是老手,都离不开flash.没有flash的支持,菜鸟们也少了一些把玩linux的动力. flash有很多安装的方法,不过性能相差很大.这里的缘由就不重要了. 下面我介绍在chromi ...

  6. 莫队 Codeforces Round #340 (Div. 2) E

    题目大意:给你一个长度为n的序列,有m个询问,每次询问一个区间[L,R],表示这个区间内,有多少的a[i]^a[i+1].....^a[j]=k. 思路:莫队去搞就好了 我们定义pre[i]=a[1] ...

  7. Uploadify & jQuery.imgAreaSelect 插件实现图片上传裁剪

    在网站中需要一个图片上传裁剪的功能,借鉴这篇文章 Ajax+PHP+jQuery图片截图上传 的指点,找到了jquery.imgAreaSelect这个不错插件,能对图片进行自定义区域选择并给出坐标, ...

  8. Lua的各种资源1

    Libraries And Bindings     LuaDirectory > LuaAddons > LibrariesAndBindings This is a list of l ...

  9. 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信

    [题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...

  10. 用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql

    1:创建shell脚本 touch sqoop_options.sh chmod 777 sqoop_options.sh 编辑文件  特地将执行map的个数设置为变量  测试 可以java代码传参数 ...