python的metaclass

元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类。解释器会先寻找类属性__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类。如果此属性没有定义,它会向上

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类。解释器会先寻找类属性__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类。如果此属性没有定义,它会向上查找父类中的__metaclass__.如果还没有发现__metaclass__属性,解释器会检查名字为__metaclass__的全局变量,如果它存在,就使用它作为元类。否则, 这个类就是一个传统类,并用 types.ClassType 作为此类的元类。

在执行类定义的时候,将检查此类正确的(一般是默认的)元类,元类(通常)传递三个参数(到构造器): 类名,从基类继承数据的元组,和(类的)属性字典。

元类何时被创建?

#!/usr/bin/env python  
  
print '1. Metaclass declaration'  
class Meta(type):  
    def __init__(cls, name, bases, attrd):  
        super(Meta,cls).__init__(name,bases,attrd)  
        print '3. Create class %r' % (name)  
  
print '2. Class Foo declaration'  
class Foo(object):  
    __metaclass__=Meta  
    def __init__(self):  
        print '*. Init class %r' %(self.__class__.__name__)  
  
# 何问起 hovertree.com

print '4. Class Foo f1 instantiation'  
f1=Foo()  
  
print '5. Class Foo f2 instantiation'  
f2=Foo()  
  
print 'END'  

输出结果:

 

1. Metaclass declaration
2. Class Foo declaration
3. Create class ‘Foo’
4. Class Foo f1 instantiation
*. Init class ‘Foo’
5. Class Foo f2 instantiation
*. Init class ‘Foo’
END

可见在类申明的时候,就执行了__metaclass__中的方法了,以后在定义类对象的时候,就只调用该类的__init__()方法,MetaClass中的__init__()只在类申明的时候执行了一次。

 

摘自《Python核心编程》

推荐:http://www.cnblogs.com/roucheng/p/pythonyunsuan.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120477.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 给Android程序猿的六个建议

    给Android程序猿的六个建议

    2022年2月1日
    39
  • 天翼云负载均衡配置ssl证书_阿里云服务器证书

    天翼云负载均衡配置ssl证书_阿里云服务器证书1、购买证书(图片有误,应该是购买通配符证书):2、申请证书:填写证书绑定域名:*.tianya.com联系人信息:xxx在自己的域名管理平台配置txt记录值,通过dns的txt记录类型来验证信息3、证书验证(根据上图中的DNS记录类型在域名管理平台进行txt记录验证,验证通过后点击上图中的验证按钮后会提示验证通过)4、申请验证完成:4.1点击验证后返回ssl证书管理平台页面会显示申请审核中4.2审核通过后下载自己需要的相应的证书备注:使用阿里云负载均衡进行https访问网站,

    2022年9月26日
    0
  • svn配置忽略文件

    svn配置忽略文件1、添加忽略项项目根目录,找到SVN->右键->属性新建,其它->选择svn:ignore输入要忽略的内容确定即可。2、全局忽略配置svn->右键->设置即可

    2022年9月13日
    0
  • 透视投影矩阵推导[通俗易懂]

    透视投影矩阵推导[通俗易懂]透视投影矩阵(PerspectiveMatrix)近截面与远截面之间构成的四棱台称为视锥体,而透视投影矩阵的任务就是把位于视锥体内的物体的顶点x,y,zx,y,zx,y,z坐标映射到[−1,1][-1,1][−1,1]范围。这相当于把这个四棱台扭曲变形成一个立方体。这个立方体叫做规范观察体(CanonicalViewVolume,CVV)。矩阵的形式(1aspect⋅tan⁡(fovy2)00001tan⁡(fovy2)0000−zNear−zFarzNear−zFar2⋅zNea

    2022年10月4日
    0
  • Linux futex_centos8 pip

    Linux futex_centos8 pipPriorityInheritance,优先级继承,是解决优先级反转的一种办法。一个经典的例子:A/B/C三个实时进程,优先级A>B>C。C持有a锁,而A等待a锁被挂起。原本C释放a锁之后,A进程就可以继续执行的,但是偏偏有个比C优先级高的B进程存在,导致C得不到运行,也就没法释放a锁,从而导致A进程一直挂起。从整体上看,进程B虽然比A优…

    2022年9月16日
    0
  • 导航栏跳转页面[通俗易懂]

    导航栏跳转页面[通俗易懂]一个页面有多个导航栏跳转页面一定要有这三步html结构部分<el-menu:default-active=”path”class=”el-menu-vertical-demo”:unique-opened=”true”@select=”listChange”><el-menu-itemindex=”/index/aiIdentify/achievementWall”>

    2022年5月30日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号