Python无类再理解--metaclass,type
上次理解过一次,时间久了,就忘了。。
再学习一次。。
http://blog.jobbole.com/21351/
=======================
但是,Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。下面的代码段:
将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是乎你可以对它做如下的操作:
1) 你可以将它赋值给一个变量
2) 你可以拷贝它
3) 你可以为它增加属性
4) 你可以将它作为函数参数进行传递
=======================
#!/usr/bin/env python # -*- coding: utf-8 -*- class ObjectCreator(object): pass print ObjectCreator def echo(o): print o echo(ObjectCreator) print hasattr(ObjectCreator, 'new_attribute') ObjectCreator.new_attribute = 'foo' print hasattr(ObjectCreator, 'new_attribute') print ObjectCreator.new_attribute ObjectCreatorMirror = ObjectCreator print ObjectCreatorMirror print ObjectCreatorMirror() def choose_class(name): if name == 'foo': class Foo(object): pass return Foo else: class Bar(object): pass return Bar MyClass = choose_class('foo') print MyClass print MyClass() print type(1) ") print type(ObjectCreator) print type(ObjectCreator()) MyShinyClass = type('MyShinyClass', (), {}) print MyShinyClass print MyShinyClass() Foo = type('Foo', (), {'bar': True}) print Foo print Foo.bar f = Foo() print f print f.bar def echo_bar(self): print self.bar FooChild = type('FooChild', (Foo,),{'echo_bar': echo_bar}) print FooChild print FooChild.bar print hasattr(Foo, 'echo_bar') print hasattr(FooChild, 'echo_bar') my_foo = FooChild() my_foo.echo_bar() age = 35 print age.__class__ print age.__class__.__class__ name = 'bob' print name.__class__ print name.__class__.__class__ def foo(): pass print foo.__class__ print foo.__class__.__class__ class Bar(object): pass print Bar.__class__ print Bar.__class__.__class__ b = Bar() print b.__class__ print b.__class__.__class__
Python无类再理解--metaclass,type的更多相关文章
- python元类深入理解
1.python 中的类 在python中,类也是一个对象,只不过这个对象拥有生成实例的能力,我们一般使用class XXX来定义一个类,在python解释器执行到这个地方的时候会自动创建出这个对象, ...
- python 创建类先执行metaclass父类__new__ > __init__>__call__ 然后再执行自己的__new__>__init__
class MyType(type): def __init__(self,*args,**kwargs): print("Mytype __init__",*args,**kwa ...
- python元类:type和metaclass
python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...
- 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
type函数的隐藏属性 相信大家都知道内置函数type是用来查看对象的数据类型的.例: 那比如我对int类查看类型呢? 有朋友会说,int是内置类啊,用自定义的应该不会这样,我们自定义一个类呢? 还是 ...
- python 元类理解
原文来自:https://segmentfault.com/a/1190000011447445 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生万物 我是谁?我从哪来里?我要到哪里去? ...
- 深入理解python元类
类也是对象 在理解元类之前,你需要先掌握Python中的类.Python 中的类概念借鉴 Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.当然在 P ...
- python 元类 MetaClass
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hel ...
- 参悟python元类(又称metaclass)系列实战(一)
写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...
- [py]python中的特殊类class type和类的两面性图解
生活中的模具 生活中 编程 万物都从无到有, 起于烟尘 () 生产原料,铁 object 车床-生产各类模具 元类即metaclass,对应python的class type 模具-生产各类实在的物品 ...
随机推荐
- php上传文件大小限制修改
打开php.ini 1.最大上传文件大小: upload_max_filesize=2M 改成自己需要的大小 2.最大post大小: post_max_size=2M 改成自己需要的大小,第二个一般比 ...
- SqlServer coalesce函数
SqlServer数据库中coalesce函数用法:在SqlServer2005中有了新的函数,它非常的实用,它就是coalesce函数,此函数可以返回参数中的第一个非空表达式,当你要在N个字段中选取 ...
- POJ 1016
http://poj.org/problem?id=1016 一道字符串处理的题目,理解题意后注意细节就好. 题意:每一串数字 都可以写成 a1 b1 a2 b2 ....ai bi 其中ai是指bi ...
- 回调函数中使用MFC类的成员或对话框控件的简单方法
在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...
- SQL Update 巧用
JOIN 样本 ********************************** Update 结存 set 结存.现有库存=c.入仓数-b.出仓数量 from 结存 a )) 入仓数 from ...
- Selenium WebDriver 处理table
首先,html table是由 table 元素以及一个或多个 tr.th 或 td 元素组成. for example: 这是一个简单的html table: 源码如下: <html> ...
- java web 学习 --第五天(Java三级考试)
第四天的学习内容:http://www.cnblogs.com/tobecrazy/p/3454860.html Response对象 response对象主要是向客户端浏览器发送二进制数据,如输出C ...
- percona-toolkit 之 【pt-deadlock-logger】说明
摘要: 死锁:是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象:当产生死锁的时候,MySQL会回滚一个小事务的SQL,确保另一个完成.上面是死锁的概念,而在M ...
- Java for LeetCode 232 Implement Queue using Stacks
Stack<Integer> stack=new Stack<Integer>(); public void push(int x) { stack.push(x); } // ...
- Java for LeetCode 223 Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...