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