Python 最有效地实例化一个类的多个对象
我正在编写一些python代码,我创建了一个罗马数字类。它的工作原理与内置的roman()类基本相同。 我想实例化从1到1000的罗马数字,而不必亲自实例化每个数字。 例如:Python 最有效地实例化一个类的多个对象,python,class,object,Python,Class,Object,我正在编写一些python代码,我创建了一个罗马数字类。它的工作原理与内置的roman()类基本相同。 我想实例化从1到1000的罗马数字,而不必亲自实例化每个数字。 例如: I = roman(1) II = roman(2) .... up to M = roman(1000) 假设我已经有了将数字转换为罗马数字的方法,那么最有效的方法是什么 因此,应该有人能够从罗马模块中导入*并键入如下内容: IV * I + II * V 然后得到 罗曼(14) 换句话说。。每个罗马数字都是它自己的
I = roman(1)
II = roman(2)
.... up to M = roman(1000)
假设我已经有了将数字转换为罗马数字的方法,那么最有效的方法是什么
因此,应该有人能够从罗马模块中导入*并键入如下内容:
IV * I + II * V
然后得到
罗曼(14)
换句话说。。每个罗马数字都是它自己的对象
numerals = [roman(i) for i in range(1, 1001)]
print(numerals)
这会给你一个从1到1000的罗马数字列表。如果您愿意,您可以访问各个号码。请注意,由于列表索引从0开始,而罗马数字从1开始,因此索引将关闭1
print(numerals[0]) # I
print(numerals[9]) # X
print(numerals[999]) # M
作为字典
由于本质上是将“IV”
之类的字符串映射到roman
类的对象,因此可能应该将它们保存在字典中,而不是本地名称空间中。假设您的roman
的\uu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuself)
方法返回的字符串类似于“I”
和“XV”
,您可以这样声明字典:
ROMANS={
str(r):r代表r(
罗马字母(i)表示范围(11000+1)内的i
)
}
现在,您可以通过ROMANS[“XXIV”]
等方式访问单个roman
对象
(字典理解和生成器表达式组合非常难看,我可能会将其隐藏在名为\u romans\u dict(上限=1000)
的函数中)
作为一堆变量
如果确实希望通过名为VII
的变量访问roman(7)
对象,可以使用刚刚创建的字典更新本地名称空间。你甚至可以在更新后扔掉字典的名字。(幸运的是,所有大写罗马数字(如“VII”)都符合Python对模块级常量的命名约定。)
#罗马=…同上
locals().update(罗马语)
德尔(罗马人)#可选
用一千个或更多的罗马数字滥发模块名称空间的智慧是另一个问题。(首先,我的语法检查器因为我使用了在任何地方都找不到的VII
和XIX
等变量而对我大喊大叫。你的老板可能也会对你大喊大叫。)
最后的狡辩
你的
roman
类可能应该拼写为roman
。Python类名(通常)在StudlyCaps中。如果我想从这个模块导入并执行像IV*I+II*V这样的罗马数字计算。。我不想说globals().update(ROMANS)而不是locals()?@JayronHubbard:在模块级作用域(通常进行导入的地方),globals()是locals()
是True
,所以没有区别。而任何更新从属名称空间(如函数定义内部)的人,大概都不希望这些古怪的罗马人泄漏到周围的名称空间中。@JayronHubbard:还有,当我想到从任何东西导入时,都会有些畏缩,我可以看到这种情况是一种罕见的情况,实际上值得冒险。罗马数字就不那么多了,但化学家可能喜欢能够从元素中导入*常数
,然后编写简单的代码,如辛烷=C+H*3+(C+H*2)*6+C+H*3
或盐质量=Na.mass+Cl.mass
。我会考虑创建一个包含这些常量和其他的模块,所以<代码>导入*<代码>不会吸收所有的帮助函数、类和其他变量以及有用的常量。