最有效地实例化类的多个对象

时间:2014-10-15 00:25:25

标签: python class object

我正在编写一些python代码,我有一个我创建的罗马数字类。它的工作原理与内置的roman()类相同。 我想实例化从1到1000的罗马数字,而不必亲自实例化每个罗马数字。 例如:

I = roman(1)
II = roman(2)
.... up to M = roman(1000)

假设我已经有办法将数字转换为罗马数字,那么最有效的方法是什么?

所以有人应该能够从罗马模块导入*并输入类似的内容:

IV * I + II * V

得到......

罗马(14)

换句话说,每个罗马数字都是它自己的对象。

2 个答案:

答案 0 :(得分:1)

作为词典

由于您基本上将"IV"之类的字符串映射到roman类的对象,因此您应该将它们保存在字典中而不是本地命名空间中。假设您的roman __str__(self)方法返回"I""XV"等字符串,您可以像这样声明字典:

ROMANS = {
  str(r): r for r in (
    roman(i) for i in range(1, 1000 + 1)
    )
  }

现在,您可以将roman个对象作为ROMANS["XXIV"]访问,依此类推。

(那个字典理解和生成器表达式组合很难看,我可能会把它隐藏在一个名为_romans_dict(upper=1000)的函数中。)

作为一堆变量

如果确实希望通过名为roman(7)的变量访问VII对象,则可以使用刚刚创建的字典更新本地命名空间。您甚至可以在更新后丢弃字典的名称。 (幸运的是,像#34; VII和#34;全部大写的罗马数字符合Python对模块级常量的命名约定。)

# ROMANS = ...same as above
locals().update(ROMANS)
del(ROMANS)  # optional

使用一千个或更多罗马数字向您的模块命名空间发送垃圾邮件的智慧是一个不同的问题。 (对于初学者,我的语法检查器尖叫我使用VIIXIX之类的变量,它无法在任何地方找到声明。你的老板也可能会尖叫你。)

最后的狡辩

您的roman课程可能拼写为Roman。 Python类名称(通常)在StudlyCaps中。

答案 1 :(得分:0)

numerals = [roman(i) for i in range(1, 1001)]
print(numerals)

这将为您提供1到1000的罗马数字列表。如果您愿意,您可以访问单个数字。请注意,索引将关闭1,因为列表索引从0开始,但罗马数字从1开始。

print(numerals[0])    # I
print(numerals[9])    # X
print(numerals[999])  # M