1. type函数

  1. name = "This is a string"
  2. print(type(name)) # <class 'str'>
  3. print("*" * 10, "分界线", "*" * 10)
  4.  
  5. cls = type('Foo', (), {})
  6. f = cls()
  7. print(type(f)) # <class '__main__.Foo'>
  8. print(type(cls)) # <class 'type'>
  9. print(cls.__name__) # Foo
  10. print("*" * 10, "分界线", "*" * 10)
  11.  
  12. def init(self, name, age):
  13. self.name = name
  14. self.age = age
  15. print(self.name, self.age)
  16.  
  17. cls = type('Foo', (object, ), {'__init__': init})
  18. f = cls('Tim', 22) # Tim 22

2. __new__函数

  1. class Foo(object):
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. print(self.name, self.age)
  6.  
  7. def tmp(self):
  8. print("call tmp()")
  9.  
  10. def __new__(cls, *args, **kwargs):
  11. print("call __new__")
  12. obj = object.__new__(cls)
  13. print("id(obj)===", id(obj))
  14. return obj
  15.  
  16. f1 = Foo('Tim', 22) # 这一个操作,等于===下面的两步操作。
  17. print("id(f1)===", id(f1))
  18. f1.tmp()
  19.  
  20. #call __new__
  21. #id(obj)=== 1507711426120
  22. #Tim 22
  23. #id(f1)=== 1507711426120
  24. #call tmp()
  25.  
  26. f2 = Foo.__new__(Foo)
  27. print("id(f2)===", id(f2))
  28. f2.__init__('Tim', 22)
  29. f2.tmp()
  30.  
  31. #call __new__
  32. #id(obj)=== 1507711426232
  33. #id(f2)=== 1507711426232
  34. #Tim 22
  35. #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. java中 equals和==区别

    一.java当中的数据类型和“==”的含义: 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean.他们之间的比较,应用双等号 ...

  2. Fuzzy模糊推导(Matlab实现)

    问题呈述 在模糊控制这门课程中,学到了与模糊数学及模糊推理相关的内容,但是并不太清楚我们在选择模糊规则时应该如何处理,是所有的规则都需要由人手工选择,还是仅需要选择其中的一部分就可以了.因此,在课程示 ...

  3. Spring框架学习笔记(7)——Spring Boot 实现上传和下载

    最近忙着都没时间写博客了,做了个项目,实现了下载功能,没用到上传,写这篇文章也是顺便参考学习了如何实现上传,上传和下载做一篇笔记吧 下载 主要有下面的两种方式: 通过ResponseEntity实现 ...

  4. Python 面向对象-上篇

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

  5. Django 通过 ORM 实现表的CRUD

    Django 通过 ORM 实现表的CRUD 单表的创建 修改 setting.py 文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backen ...

  6. Mybatis加入日志

    *在mybatis-config.xml核心配置文件中加入如下设置,在configration中标签中加入 <!--打印日志,方便看输出SQL --> <settings> & ...

  7. nyoj 845-无主之地1 (struct)

    845-无主之地1 内存限制:64MB 时间限制:1000ms 特判: No 通过数:8 提交数:16 难度:0 题目描述: 子晓最近在玩无主之地1,他对这个游戏的评价不错,结合了FPS与RPG元素, ...

  8. 关于Java 值传递深度分析

    首先说观点:java只有值传递没有引用传递 然后再来看看值传递与引用传递两者的定义 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改, ...

  9. Spring的整体架构的认识

    Spring的整体架构的认识 一).spring是用来做什么的? spirng使用基本的JavaBean来完成以前EJB所完成的事. 二).EJB EJB: Enterprise JavaBean, ...

  10. PHP创建对象的6种方式

    创建对象实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...