泛型数字类重构?

时间:2017-06-05 14:07:57

标签: python class refactoring

我刚刚制作了一个通用数字类。

这个类很简单,描述如下

  • 从任何有序字符列表中,使数字类表示该有序字符列表。
  • create_number_class("01")返回二进制数字类
  • create_number_class("0123456789")返回十进制数字类
  • create_number_class("abcdefghij")返回十进制数字类,但将每个数字表示为字母。

下面是通用数字类定义。

我认为它是制作精良的类定义。

该类定义是否需要改进?

谢谢大家。总是。

离)

ABC_Class = create_number_class("abc")
x = ABC_Class("baa")
y = ABC_Class("bbb")
print(x+y)
#output digits: abc, v: cbb, decimal_v: 22

下面是类定义

def create_number_class(alphabet):
    class temp(object):
        digits = alphabet
        def __init__(self, v):
            self.v = v
            self.decimal_v = self.to_decimal(self)
        @staticmethod
        def to_decimal(self):
            r = 0
            for i in range(0, len(self.v)):
                r += len(temp.digits)**(len(self.v)-i-1)*(temp.digits.index(self.v[i]))
            return r
        @classmethod
        def from_decimal(cls, decimal_v):
            r = []
            mod = len(temp.digits)
            if decimal_v < mod:
                return cls(temp.digits[decimal_v])
            while True:
                remainder = decimal_v % mod
                r.append(remainder)
                decimal_v = int((decimal_v - remainder)/ mod)
                if decimal_v < mod:
                    r.append(decimal_v)
                    break
            r = "".join(list(reversed([temp.digits[x] for x in r])))
            #r = "".join(list(reversed([str(temp.digits.index(str(x))) for x in r])))
            return cls(r)
        def __add__(self, other):
            return temp.from_decimal(self.decimal_v+other.decimal_v)
        def __sub__(self, other):
            return temp.from_decimal(self.decimal_v-other.decimal_v)
        def __mul__(self, other):
            return temp.from_decimal(self.decimal_v*other.decimal_v)
        def __floordiv__(self, other):
            return temp.from_decimal(self.decimal_v//other.decimal_v)
        def __str__(self):
            return "digits: {}, v: {}, decimal_v: {}".format(temp.digits, self.v, self.decimal_v)
        def convert_to(self, new_class):
            return new_class.from_decimal(self.decimal_v)
    return temp

下面是示例

BinClass = create_number_class("01")
DecimalClass = create_number_class("0123456789")

x = BinClass("111")
x = BinClass("1000")
y = BinClass("10")

HexClass = create_number_class('0123456789ABCDEF')
x = HexClass('1')
y = HexClass('AA')

print(x+y)
print(x-y)
print(x*y)
print(x//y)
print(x.convert_to(DecimalClass))
isinstance(x, BinClass)

0 个答案:

没有答案