Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最有效地实例化一个类的多个对象_Python_Class_Object - Fatal编程技术网

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

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) 换句话说。。每个罗马数字都是它自己的

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

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
。我会考虑创建一个包含这些常量和其他的模块,所以<代码>导入*<代码>不会吸收所有的帮助函数、类和其他变量以及有用的常量。