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 元类的更多相关文章

  1. python元类:type和metaclass

    python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...

  2. Python 元类 - Metaclasses

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

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

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

  4. python 元类

    转载自  http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...

  5. [python]python元类

    这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...

  6. Python元类实践--自己定义一个和collections中一样的namedtuple

    大家可能很熟悉在collections模块中有一个很好用的扩展数据类型-namedtuple. 如果你还不知道这个类型,那么请翻看标准手册. 我利用元类轻松定义一个namedtuple. 先把代码贴上 ...

  7. python元类分析

    刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下..不知道这是个啥东西... 用下面几个定义来说明吧: (1)Python中,类也是对象..仅仅只是这样的对象比較的特殊,他用于创建别的 ...

  8. python元类理解2

    恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类. 代码如下,这是一个使用了函数做元类传递给类: input: def upper_attr(class_nam ...

  9. 3.python元类编程

     1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法.在python中他们对应的分别是属性self.xxx和类方法.但有时我们需要的属性需要根据 ...

随机推荐

  1. C语言:互质

    今天遇到一道奇怪的程序题,和平常的不同.同样都是互质,但是一般的题目都是判断两个数字是否互质,但这道题则是给定一个数字n,要求输出所有小于等于n的与n互质的数,题目已经在下面给出: 质数与互质概念不是 ...

  2. 理解Spark SQL(一)—— CLI和ThriftServer

    Spark SQL主要提供了两个工具来访问hive中的数据,即CLI和ThriftServer.前提是需要Spark支持Hive,即编译Spark时需要带上hive和hive-thriftserver ...

  3. CSS:CSS弹性盒子布局 Flexible Box

    一.简介 flexbox:全称Flexible Box, 弹性盒子布局.可以简单实现各种伸缩性的设计,它是由伸缩容器和伸缩项目组成.任何一个元素都可以指定为flexbox布局.这种新的布局方案在200 ...

  4. 安装win7和ubuntu16.04双系统

    硬件:2012年本子  话硕A55V Service 准备: 首先通过一键还原备份win7系统!不清楚某些失误会不会备份也不能拯救! 清出100g硬盘空间,ubuntu会安装在这里 查看当前win7启 ...

  5. error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

    用Python打开图像始终提示错误 error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\highgui\src\window.c ...

  6. 破解网站二维码验证,Java实现,不调用任何平台api接口

    package image.images; import java.io.File; import java.io.IOException; import java.io.InputStream; i ...

  7. Java虚拟机的内存

    JDK1.8之前,java内存分为 线程共享区:堆.方法区.直接内存(非运行时数据区的一部分).线程私有区:程序计数器.虚拟机栈.本地方法栈. JDK1.8开始,虚拟机取消了方法区,改为元空间. 程序 ...

  8. 线程池ThreadPoolExecutor的使用方法

    方法我们通过继承Thread类和实现runnable接口或者callable接口三种方式实现. 继承Thread类实际上也是实现了runnable接口,被继承的类主要是实现run()方法,通过star ...

  9. Mybatis日志体系

    承接上一篇关于spring 5.x的日志体系,本篇看看Mybatis的日志体系及实现,Mybatis版本基于3.x. 关于mybatis的官方文档比较友好,分门别类,各有论述,如mybatis官方文档 ...

  10. 创建指定python版本的虚拟环境

    使用virtualenvwrapper管理虚拟环境 鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper. virtualenvwrapper提供了一系 ...