[TimLinux] Python 元类
1. type函数
name = "This is a string"
print(type(name)) # <class 'str'>
print("*" * 10, "分界线", "*" * 10) cls = type('Foo', (), {})
f = cls()
print(type(f)) # <class '__main__.Foo'>
print(type(cls)) # <class 'type'>
print(cls.__name__) # Foo
print("*" * 10, "分界线", "*" * 10) def init(self, name, age):
self.name = name
self.age = age
print(self.name, self.age) cls = type('Foo', (object, ), {'__init__': init})
f = cls('Tim', 22) # Tim 22
2. __new__函数
class Foo(object):
def __init__(self, name, age):
self.name = name
self.age = age
print(self.name, self.age) def tmp(self):
print("call tmp()") def __new__(cls, *args, **kwargs):
print("call __new__")
obj = object.__new__(cls)
print("id(obj)===", id(obj))
return obj f1 = Foo('Tim', 22) # 这一个操作,等于===下面的两步操作。
print("id(f1)===", id(f1))
f1.tmp() #call __new__
#id(obj)=== 1507711426120
#Tim 22
#id(f1)=== 1507711426120
#call tmp() f2 = Foo.__new__(Foo)
print("id(f2)===", id(f2))
f2.__init__('Tim', 22)
f2.tmp() #call __new__
#id(obj)=== 1507711426232
#id(f2)=== 1507711426232
#Tim 22
#call tmp()
3. __init__函数
__init__函数,如果由Foo类能声明对象的时候,调用顺序是,先调用__new__,然后通过使用python提供的object.__new__方法,来创建一个对象,接下来把这个对象返回,然后由这个返回的对象,来调用__init__方法。
Foo.__new__ --> 通过object.__new__生产对象 --> 使用这个对象调用Foo.__init__方法-->完成类的对象声明
4. __metaclass__变量
们允许我们在一条class语句的末尾,插入当创建一个类对象的时候自动运行的逻辑。这个逻辑不会把类名重新绑定到一个装饰器可调用对象,而是把类自身的创建指向特定的逻辑。换句话说,元类最终只是定义自动运行代码的另外一种方式。
通过元类以及前面列出的其他工具, Python 为我们提供了在各种环境中插入逻辑的方法——在运算符计算时、属性访问时、函数调用时、类实例创建时,现在是在类对象创建时。
和类装饰器不同,它通常是添加实例创建时运行的逻辑,元类在类创建时运行。同样的,它们都是通常用来管理或扩展类的钩子,而不是管理其实例。例如,元类可以用来自动为类的所有方法添加装饰,把所有使用的类注册到一个 API ,自动为类添加用户接口逻辑,在文本文件中从简单声明来创建或扩展类,等等。由于我们可以控制如何创建类(并且通过它们的实例获取的行为),它们的实用性潜在地很广泛。
我的理解:元类,用于给类,自动添加一些东西,比如自动添加一些方法,把实例方法的名称统一加上前缀等等。
元类是type类的子类,类是type类的对象,创建类的过程,就是创建一个特定的对象(类),那就存在调用该对象类的__new__,__init__方法,而对象需要能够带括号运行,这个是对象调用了创建该对象类的__call__方法,当这个对象换为类之后,类对象的初始化方式,根普通类对象调用__call__类似。
[TimLinux] Python 元类的更多相关文章
- python元类:type和metaclass
python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...
- Python 元类 - Metaclasses
Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- python 元类
转载自 http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...
- [python]python元类
这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...
- Python元类实践--自己定义一个和collections中一样的namedtuple
大家可能很熟悉在collections模块中有一个很好用的扩展数据类型-namedtuple. 如果你还不知道这个类型,那么请翻看标准手册. 我利用元类轻松定义一个namedtuple. 先把代码贴上 ...
- python元类分析
刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下..不知道这是个啥东西... 用下面几个定义来说明吧: (1)Python中,类也是对象..仅仅只是这样的对象比較的特殊,他用于创建别的 ...
- python元类理解2
恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类. 代码如下,这是一个使用了函数做元类传递给类: input: def upper_attr(class_nam ...
- 3.python元类编程
1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法.在python中他们对应的分别是属性self.xxx和类方法.但有时我们需要的属性需要根据 ...
随机推荐
- JS中的相等性判断===, ==, Object.is()
首发地址:http://www.geeee.top/2019/11/15/equality-comparisons/,转载请注明出处 相信刚接触JS的人都会被他的想等性判断给整糊涂,看看下面代码,你能 ...
- thinkphp5中取消了3.2版本中的单字母函数,初用tp5可能不大适应,下边给出两者的对应参照表,以便查阅。
3.2版本 5.0版本 C config E exception G debug L lang T 废除 I input N 废除 D model M db A controller R action ...
- 使用 Casbin 作为 ThinkPHP 的权限控制中间件
PHP-Casbin 是一个强大的.高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理. Think-Casbin 是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发 ...
- 【SSM Spring 线程池 OJ】 使用Spring线程池ThreadPoolTaskExecutor
最近做的Online Judge项目,在本地判题的实现过程中,遇到了一些问题,包括多线程,http通信等等.现在完整记录如下: OJ有一个业务是: 用户在前端敲好代码,按下提交按钮发送一个判题请求给后 ...
- 开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比
ARM32体系中有31或33个通用寄存器,没有特定的某种态下有r0-r15一共16个寄存器,快速中断态下有另一组r8-r12备份寄存器,在用户态和系统态之外其它态下都各自有一组r13-r14备份寄存器 ...
- Unix, Linux以及NT内核和它们各自衍生的系统关系图
- Java多线程——多线程方法详解
本系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线程的深入剖 ...
- Install Elastic stack
1. 安装环境 系统版本:centos 6.9 java版本:1.8.0_181 程序版本:6.6 (整个stack需保持相同的版本) 2. 安装顺序 1 Elasticsearch 2 Kibana ...
- Laravel 菜鸟的晋级之路
第一阶段:简单的增删改查 这是最开始接触Laravel的一个阶段.如果有PHP经验,那么应该能很快找到MVC的路径,然后驾轻就熟的开始写起来.虽然还显得有些笨拙,不过很快就能做出一些内容了.如果没有P ...
- LLDB调试详解--逆向开发
前言 今天讲述在苹果日常开发中一个装逼神器LLDB,是Xcode内置的动态调试工具. 在iOS系统程序开发中,会经常需要代码调试的追踪, 最常用的也是LLDB(low level debugger) ...