def __init__(self,func):
     '''
     abstract の引数が 1 つで function,classmethod,staticmethod の場合に呼び出される。
     func の情報 を抽出して保持する
     '''
     # self._func = func
     if not isinstance(func,(FunctionType,classmethod,staticmethod)): raise AbstractAnotationError()
     self.info = get_info(func)
示例#2
0
def validate(bases,attrs):
    A = {}
    for key,val in attrs.iteritems():
        if isinstance(val,AbstractMethod): raise NotImplementError(val)
        if not isinstance(val,(FunctionType,classmethod,staticmethod)): continue
        A[key] = get_info(val)
    C = set() # 抽象クラスのセット
    D = get_bases(bases)
    for c in bases:
        for key,val in c.__dict__.iteritems():
            if not isinstance(val,AbstractMethod): continue
            #C.add(c)
            #info = val.info
            B = A.get(key,None)
            if B is None: raise NotImplementError(val)
            if B != val.info: raise BadImplementError(val)
    #D = tuple([c for c in bases if c not in C]) # 抽象クラスでない基底クラスのセット
    # t = type('t',D,{})
    # object.__new__ function -> function
    # A.__new__ staticmethod -> function
    return type('t',D,{}).__new__