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

    xiaoxiao2025-02-16  11

    元类

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

    #-*-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"
    转载请注明原文地址: https://ju.6miu.com/read-1296506.html
    最新回复(0)