资讯专栏INFORMATION COLUMN

由type()函数对类和实例使用结果差异而引出的一个问题

zhangwang / 1148人阅读

摘要:但是随后有人提出反对意见并说这个是随后搜索到这篇文章深刻理解中的元类里面介绍了如何使用函数创建一个类,并解释了属性。

有如下代码

#-*-coding:utf-8-*-
class a():
    pass
a1 = a()
print(type(a),type(a1))

两个python版本分别为
Python2.7.11
Python3.5.1

在python2中得到的结果
(, )
a是一个类对象,a1是一个实例

在python3中得到的结果

a是一个type?,a1是a的一个实例

在python3中对一个类对象使用type()会得到type这个结果?

解释?

有人这样回答:

这是因为type函数可以创建类
其实class本质上就是type函数
class的定义是运行时动态创建的,而创建class的方法就是使用type()函数。


In [2]: def fn(self,name = "world"):
   ...:     print("hello,%s" % name)
   ...:

In [3]: Hello = type("Hello", (object,), dict(hello=fn))

In [4]: h = Hello()

In [5]: h.hello()
hello,world

In [6]: print(type(Hello))


In [7]: print(type(h))


这就是用type函数创建类的实例
要创建一个class对象,type()函数依次传入3个参数:

class的名称; 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。

但是随后有人提出反对意见并说这个是metaclass,随后搜索到这篇文章

深刻理解Python中的元类(metaclass) http://blog.jobbole.com/21351/

里面介绍了如何使用type函数创建一个类(MyClass = type("MyClass", (), {})),并解释了__metaclass__属性。

函数type实际上是一个元类
当定义了一个类

class Foo(Bar):
    pass

Python做了如下的操作:

Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧跟我的思路)。如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。

因此,元类就是用来创建类的玩意。 type就是Python的内建元类(和str,int类似的性质),你也可以创建自己的元类。
具体方法上面的文章中已经有了。

“元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。”
—— Python界的领袖 Tim Peters

感觉还是不要去碰的比较好。。。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38498.html

相关文章

  • Python实例一个类背后发生了什么

    摘要:好吧,事实上,类本身也是实例,当然,它们是元类的实例。中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了。 写在最前面 一些很重要的知识,我的写得有点乱,也可以去看这些文章 Python 面向对象(初级篇) Python 面向对象(进阶篇) 深刻理解Python中的元类(metaclass) 首先来看一个例子,正常情况下我们定义并且实例一个类如下 class Foo(ob...

    shusen 评论0 收藏0
  • C++类和对象(万字总结)(建议收藏!!!)

    摘要:当你用该日期类创建一个对象时,编译器会自动调用该构造函数对新创建的变量进行初始化。注意构造函数的主要任务并不是开空间创建对象,而是初始化对象。编译器对内置类型使用默认构造函数时,对其成员赋的是随机值。 ...

    masturbator 评论0 收藏0
  • JavaScript_设计模式

    摘要:设计模式是一套可复用的,被众人知晓,经过编目分明的,经验的总结。创建类安全工厂判断是否调用关键字设计模式设计模式运算符可以用来判断某个构造函数的属性所指向的對象是否存在于另外一个要检测对象的原型链上。 设计模式 是一套可复用的,被众人知晓,经过编目分明的,经验的总结。作用:使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性 模式类型 创建型设计模式:解决对象在创建时产...

    BDEEFE 评论0 收藏0
  • SICP Python 描述 2.6 实现类和对象

    摘要:以这种方式实现对象系统的目的是展示使用对象隐喻并不需要特殊的编程语言。我们的实现并不遵循类型系统的明确规定。反之,它为实现对象隐喻的核心功能而设计。是分发字典,它响应消息和。 2.6 实现类和对象 来源:2.6 Implementing Classes and Objects 译者:飞龙 协议:CC BY-NC-SA 4.0 在使用面向对象编程范式时,我们使用对象隐喻来指导程序...

    chenjiang3 评论0 收藏0

发表评论

0条评论

zhangwang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<