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