属性错误:对象"int"没有属性

  • 本文关键字:属性 int 对象 错误 python
  • 更新时间 :
  • 英文 :

class RomanNumerals():
def __init__(self,number):
self.num = number
def from_roman(self):
int_num=0
rom = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
i=0
while (i<len(self.num)):
if(i+1==len(self.num)):
int_num+=rom[self.num[i]]
break
else:
if (rom[self.num[i]]<rom[self.num[i+1]]):
int_num+=rom[self.num[i+1]]-rom[self.num[i]]
i+=2
else:
int_num+=rom[self.num[i]]
i+=1
return int_num
def to_roman(self):
val = (1000, 900,  500, 400, 100,  90, 50,  40, 10,  9,   5,  4,   1)
syb = ('M',  'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
roman_num = ""
for i in range(len(val)):
count = int(self.num / val[i])
roman_num += syb[i]*int(count)
self.num -= val[i] * count
return roman_num

我打电话给RomanNumerals.to_roman (1000)- 它给出了一个错误:

AttributeError: object 'int' does not have attribute 'num'

我的代码没有通过测试,尽管一切都对我有用。请告诉我在哪里挖掘以弄清楚。

如果你打电话给RomanNumerals.to_roman (1000)那么你通过 1000 作为self。但self应该是类的一个实例。

to_roman是一个实例方法,您应该在类的实例上调用它。

r = RomanNumerals(1000)
print(r.to_roman())

(尽管我在from_roman中指出,您似乎希望self.num是一个字符串或列表,这与您在to_roman中处理它的方式不一致。

或者,如果您只是将to_roman用作独立函数,那么您应该删除类并编写to_roman以接受参数作为纯整数。

我非常了解这一点,所以我检查了班级的表现。这是Codewars的任务,在测试中有这样的测试:

RomanNumerals.to_roman (1000)

我知道为这个任务编写一个函数更容易,但任务指出你需要写一个类,测试是通过这样一个奇怪的请求进行的。

我想通了。这是我问题的代码:

class RomanNumerals():
def from_roman(num_rom):
int_num=0
rom = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
i=0
while (i<len(num_rom)):
if(i+1==len(num_rom)):
int_num+=rom[num_rom[i]]
break
else:
if (rom[num_rom[i]]<rom[num_rom[i+1]]):
int_num+=rom[num_rom[i+1]]-rom[num_rom[i]]
i+=2
else:
int_num+=rom[num_rom[i]]
i+=1
return int_num
def to_roman(num_ar):
val = (1000, 900,  500, 400, 100,  90, 50,  40, 10,  9,   5,  4,   1)
syb = ('M',  'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
roman_num = ""
for i in range(len(val)):
count = int(num_ar / val[i])
roman_num += syb[i]*int(count)
num_ar -= val[i] * count
return roman_num
print(RomanNumerals.to_roman(1000))

我没想到他们会开始减去我。创建这个网站似乎是为了帮助和解释不太合格的人......

更优雅的求解方式:

class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
i = 0
num = 0
while i < len(s):
if i+1<len(s) and s[i:i+2] in roman:
num+=roman[s[i:i+2]]
i+=2
else:
#print(i)
num+=roman[s[i]]
i+=1
return num
ob1 = Solution()
print(ob1.romanToInt("III"))
print(ob1.romanToInt("CDXLIII"))

最新更新