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)
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__