Python字符串和实例对象混淆

时间:2015-04-17 07:45:34

标签: python string instance

在一个类中,在__repr__构造函数中,python对什么是字符串以及什么不是很困惑。这是一个学校项目,不用担心,我实际上不会在这里处理社会安全号码。

以下代码不起作用:

def __repr__(self):
    return (
        '\nName:\t'+self.getName()+':\t\t\tNurse\n'+
        '\tPhone:\t\t\t\t\t\t('+str(self.getPhoneNumber())[0:3]+') '+
        str(self.getPhoneNumber())[3:6]+'-'+str(self.getPhoneNumber())[6:10]+'\n'+
        '\tOverseeing Doctor:\t\t\t'+self.getDoctor()+'\n'
        '\tDescription:\t\t\t\t'+self.getDesc()+'\n'+
        '\tBirthday:\t\t\t\t\t'+self.getBDay()+'\n'+
        '\tSocial Security Number:\t\t***-**-'+str(round(self.getSocial()))[5:9]+'\n'+#error is in this line
        str(self._cases[i] for i in range(len(self._cases)))
    )

然而,在另一个类中,我有几乎相同的代码可以工作:

def __repr__(self):
    return (
        '\nName:\t'+self.getName()+':\t\t\tDoctor\n'+
        '\tPhone:\t\t\t\t\t\t('+str(self.getPhoneNumber())[0:3]+') '+
        str(self.getPhoneNumber())[3:6]+'-'+str(self.getPhoneNumber())[6:10]+'\n'+
        '\tDepartment:\t\t\t\t\t'+self.getDepartment()+'\n'
        '\tDescription:\t\t\t\t'+self.getDesc()+'\n'+
        '\tBirthday:\t\t\t\t\t'+self.getBDay()+'\n'+
        '\tSocial Security Number:\t\t***-**-'+str(self.getSocial())[5:9]+'\n'+
        str(self._cases)+'\n'
    )

请告诉我两者之间有什么不同,以及如何修复初始代码。

1 个答案:

答案 0 :(得分:1)

您声称此部分中存在错误:

str(round(self.getSocial()))[5:9]

但没有告诉我们你的实际错误; 追溯和异常消息会出现错误,但如果没有这些细节,我们无法告诉您有关可能出现的问题。也许self.getSocial()会返回一个字符串,round()只需要浮点数

>>> round('123')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a float is required

您需要向我们提供错误消息以及您的输入(self.getSocial()的返回值)和预期输出,以便我们可以帮助您解决该部分;也许你误解了round()的作用。

接下来,您尝试将生成器表达式转换为字符串:

str(self._cases[i] for i in range(len(self._cases))

括号之间的所有内容都是延迟评估循环,但str()不会为您评估它。

如果您想要生成所有案例的字符串,并与标签一起使用,请使用str.join()代替:

'\t'.join([str(self._cases[i]) for i in range(len(self._cases)])

你真的应该考虑使用str.format()模板;它将为很多改进和可读的代码做出贡献。你的工作&#39;示例将转换为:

def __repr__(self):
    phone = str(self.getPhoneNumber())
    social = str(self.getSocial())
    return (
        '\n'
        'Name:\t{name}:\t\t\tDoctor\n'
        '\tPhone:\t\t\t\t\t\t({phone1}) {phone2}-{phone3}\n'
        '\tDepartment:\t\t\t\t\t{dept}\n'
        '\tDescription:\t\t\t\t{desc}\n'
        '\tBirthday:\t\t\t\t\t{bday}\n'
        '\tSocial Security Number:\t\t***-**-{social}\n'
        '{cases}\n').format(
            name=self.getName(), 
            phone1=phone[:3], phone2=phone[3:6], phone3=phone[6:10],
            dept=self.getDepartment(), desc=self.getDesc(),
            bday=self.getBDay(), social=social[5:9],
            cases=self._cases)