python 元类型

  • 1元类型示例--有序的属性

自定义Python的类创建中的经典例子:

这个元类行会记录属性和方法的定义顺序。如下是实现的3个具体步骤:

1.创建一个元类型。元类型的__prepare__()和__new__()方法会改变目标类创建的方式,会将原本的dict类替换为OrderedDict类。

2.创建一个基于此元类型的抽象基类。这个抽象类简化了其他类继承这个元类型的过程。

3.创建一个继承于这个抽象基类的子类,这样它就可以获得元类型的默认行为。

eg:

import collections

class Ordered_Attributes(type):

    @classmethod

    def __prepare__(metacls, name,bases,**kwds):

        return collections.OrderedDict()

    def __new__(cls,name,bases,namespace,**kwds):

        result = super().__new__(cls,name,bases,namespace)

        result._order = tuple(n for n in namespace if not n.startswith('__'))

        return result


  • 2元类型示例--自引用


如下的是Unit类的定义,这个类的目的是Unit.value()可以将一个值从给定的单位转换为标准单位,而Unit.convert()可以将一个值从标准单位转换为给定单位。

class Unit:

    factor = 1.0

    standard = None#Reference to the appropriate StandardUnit

    name = ""#abbreviation of the unit's name

    @classmethod

    def value(class_, value):

        if value is None: return None

        return None

    @classmethod

    def convert(class_, value):

        if value is None: return None

        return None

我们定义一个可以向类定义中插入一个循环引用的元类型,代码中强制的将变量standard作为类定义的一部分。

class UnitMeta(type):

    def __new__(cls, name, bases, dict):

        new_class = super().__new__(cls, name,bases,dict)

        new_class.standard = new_class

        return new_class

    

class Standard_Unit(Unit,metaclass=UnitMeta):

    pass


class INCH(Standard_Unit):

    """Inches"""

    name = "in"


class FOOT(Unit):

    '''feet'''

    name = 'ft'

    standard = INCH

    factor =1/12


class CENTIMETER(Unit):

    '''centimeters'''

    name = 'cm'

    standard = INCH

    factor = 2.54


class METER(Unit):

    '''meters'''

    name = 'm'

    standard = INCH

    factor = 0.0254

评论

© foreveryoung2014 | Powered by LOFTER