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