python核心编程学习笔记-2016-08-13-06-元类

元类

从书中内容来看,元类用于创建类时,对创建类这一行为作出规范。比如说规定创建出来的类必须具有某些属性等。而我们默认的元类是创建类,不去管创建出来的类时什么样子的。

#-*-coding: utf-8-*-

from time import ctime

print "*** Welcome to Metaclasses!"
print "\tMetaclasses declaration first."

class MetaC(type): # 定义元类
    def __init__(cls, name, bases, attrd):
        super(MetaC, cls).__init__(name, bases, attrd)
        print "***Created class %r at: %s" % (name, ctime())

print "\tClass 'Foo' declaration next."

class Foo(object): # 定义类
    __metaclass__ = MetaC # 设置类属性__metaclass__为MetaC
    def __init__(self):
        print "*** Instantiated class %r at: %s" % (self.__class__.__name__, ctime())

print "\tClass 'Foo' instantiation next."
f = Foo()
print "\tDONE"


#-*-coding: utf-8-*-

# 元类,按照这个代码的理解,就是对创建的类作出规范,要求创建出来的类具有某些特殊属性,否则采取相应措施,如引发异常等。

from warnings import warn

class ReqStrSugRepr(type):
    def __init__(cls, name, bases, attrd):
        super(ReqStrSugRepr, cls).__init__(name, bases, attrd)

        if '__str__' not in attrd: # 如果创建的类中,没有重制属性__str__,引发TypeError异常。
            raise TypeError("Class requires overriding of __str__()") 
        
        if '__repr__' not in attrd: # 如果创建的类中,没有重制属性__repr__,发出警告。
            warn("Class suggests overriding of __repr__()\n", stacklevel = 3)

print "*** Defined ReqStrSugRepr (meta)class\n"

class Foo(object): # 重制了__str__和__repr__,没有引发TypeError异常,也没有警告
    __metaclass__ = ReqStrSugRepr
    
    def __str__(self):
        return "Instance of class:", self.__class__.__name__

    def __repr__(self):
        return self.__class__.__name__

print "*** Defined Foo class\n"

class Bar(object): # 只重制__str__,没有引发异常,但是发出了警告
    __metaclass__ = ReqStrSugRepr
    
    def __str__(self):
        return "Instance of class:", self.__class__.__name__

print "*** Defined Bar class\n"

class FooBar(object): # __str__和__repr__都没有重制,引发TypeError异常,并发出警告
    __metaclass__ = ReqStrSugRepr
    pass

print "*** Defined FooBar class\n"



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值