python元类:type和metaclass
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的更多相关文章
- python 元类 type metaclass
python中一切皆对象,类对象创建实例对象,元类创建类对象,元类创建元类. 元类创建类对象有2中方式: 一.type方法 type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性 ...
- python 元类metaclass
文章转自:http://www.cnblogs.com/linhaifeng/articles/8029564.html 一 知识储备 exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域 ...
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...
- Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法
Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...
- python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法
目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...
- python 元类的简单解释
本文转自博客:http://www.cnblogs.com/piperck/p/5840443.html 作者:piperck python 类和元类(metaclass)的理解和简单运用 (一) p ...
- Python元类之由浅入深
前言 元类属于python面向对象编程的深层次的魔法,非常重要,它使我们可以更好的掌控类从创建到消亡的整个生命周期过程.很多框架的源码中都使用到了元类.例如 Django Framework 中的 ...
- Python 元类 - Metaclasses
Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
随机推荐
- 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 清理工作: ...
- 解决SQL Server 2008 64位系统无法导入Access/Excel的问题
最近更换了新服务器,操作系统Windows Server 2008 X64,数据库SQL Server 2008 X64,Office 2007(好像只有32位),在存储过程执行OpenDatasou ...
- 为VSCODE添加右键菜单
参考:https://blog.csdn.net/GreekMrzzJ/article/details/82194913 1.创建一个名为vscode.reg的空文本文件,填入下列内容 Windows ...
- sqlserver 2008连接
初次安装使用SQL server 2008时,可能会遇到无法连接到(local)的情况.那么,如何解决此问题? 工具/原料 SQL server 2008 方法/步骤 1 打开SQL se ...
- Debian最完美安装flash的教程//适用于所有linux版本
话说不管是新手还是老手,都离不开flash.没有flash的支持,菜鸟们也少了一些把玩linux的动力. flash有很多安装的方法,不过性能相差很大.这里的缘由就不重要了. 下面我介绍在chromi ...
- 莫队 Codeforces Round #340 (Div. 2) E
题目大意:给你一个长度为n的序列,有m个询问,每次询问一个区间[L,R],表示这个区间内,有多少的a[i]^a[i+1].....^a[j]=k. 思路:莫队去搞就好了 我们定义pre[i]=a[1] ...
- Uploadify & jQuery.imgAreaSelect 插件实现图片上传裁剪
在网站中需要一个图片上传裁剪的功能,借鉴这篇文章 Ajax+PHP+jQuery图片截图上传 的指点,找到了jquery.imgAreaSelect这个不错插件,能对图片进行自定义区域选择并给出坐标, ...
- Lua的各种资源1
Libraries And Bindings LuaDirectory > LuaAddons > LibrariesAndBindings This is a list of l ...
- 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信
[题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...
- 用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql
1:创建shell脚本 touch sqoop_options.sh chmod 777 sqoop_options.sh 编辑文件 特地将执行map的个数设置为变量 测试 可以java代码传参数 ...