[深入Python]简单事情复杂化:Python计算阶乘

#coding:utf-8

def new(cls, *args, **kwargs):
    '''
    若cls是函数,则调用之;若cls是类型,则生成一个cls类型的对象
    '''
    return cls(*args, **kwargs)

class Number(object):
    pass

class IntegralNumber(int, Number):
    '''
    整数类,自定义了一个toInt函数,可以把自己转换为一个int型。
    折腾了半天,x=IntegralNumber(3) 最终就是x=3
    '''
    def toInt(self):
        return new (int, self)

class InternalBase(object):
    '''
    按设计者的意思,每个数学系统(StandardMathematicsSystem)应该有个基数
    该类就是来表示这个基数的,这里的StandardMathematicsSystem的基数是2
    '''
    def __init__(self, base):
        self.base = base.toInt()

    def getBase(self):
        return new (IntegralNumber, self.base)

class MathematicsSystem(object):
    '''
    MathematicsSystem实现了一个最简单的单例类,需通过getInstance获取实例
    '''
    def __init__(self, ibase):
        Abstract

    @classmethod
    def getInstance(cls, ibase):
        try:
            cls.__instance
        except AttributeError:
            cls.__instance = new (cls, ibase)
        return cls.__instance

class StandardMathematicsSystem(MathematicsSystem):
    '''
    用于计算的数学系统
    '''
    def __init__(self, ibase):
        '''
        验明基数
        '''
        if ibase.getBase() != new (IntegralNumber, 2):
            raise NotImplementedError
        self.base = ibase.getBase()

    def calculateFactorial(self, target):
        '''
        实际干活
        '''
        result = new (IntegralNumber, 1)
        i = new (IntegralNumber, 2)
        while i <= target:
            result = result * i
            i = i + new (IntegralNumber, 1)
        return result


print StandardMathematicsSystem.getInstance(new (InternalBase, new (IntegralNumber, 2))).calculateFactorial(new (IntegralNumber, 6)) #720

 

posted @ 2013-02-07 11:17  鸪斑兔  阅读(1862)  评论(0编辑  收藏  举报