Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 定义Str方法的问题_Python_Class_Methods - Fatal编程技术网

Python 定义Str方法的问题

Python 定义Str方法的问题,python,class,methods,Python,Class,Methods,我在下面的程序中遇到了问题。我试图在这里为这个类定义一个\uuu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法,这样当打印一个班级学生的实例时,它就会打印出以下格式的内容:“我的名字是uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我已经上了几年大学,并且已经编写了一些程序。”任何帮助 class Student(): def __init__(self, name, years_at_umich=1): self

我在下面的程序中遇到了问题。我试图在这里为这个类定义一个
\uuu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,这样当打印一个班级学生的实例时,它就会打印出以下格式的内容:
“我的名字是uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我已经上了几年大学,并且已经编写了一些程序。”
任何帮助

class Student():
    def __init__(self, name, years_at_umich=1):
        self.name = name
        self.years_UM = years_at_umich
        self.bonus_points = random.randrange(1000)
        self.programs_written = 0
    def __str__(self):
        return "My name is %s. I've been in college for %d years and I've written %d programs" \
            %(self.name, self.years_UM, self.programs_written)
    def shout(self, phrase_to_shout):
        print phrase_to_shout  

    def year_at_umich(self):
        return self.years_UM

    def write_programs(self, progs=1):
        self.programs_written += progs
        return self.programs_written

如果根据不同的值对程序进行测试,则程序无法正确执行。现在只有学生4的考试通过了。任何帮助都会很好

class Student(unittest.TestCase):
    def test_student1(self):
        student1 = Student("Lyra")
        self.assertEqual(student1.__str__(),"My name is Lyra. I've been at UMich for 1 years and I've written 0 programs.")
    def test_student2(self):
        student2 = Student("Aisha")
        student2.write_programs()
        self.assertEqual(student2.__str__(),"My name is Aisha. I've been at UMich for 1 years and I've written 1 programs.")
    def test_student3(self):
        student3 = Student("Ali",3)
        student3.write_programs(4)
        self.assertEqual(student3.__str__(),"My name is Ali. I've been at UMich for 3 years and I've written 4 programs.")
    def test_student4(self):
        student4 = Student("Aja")
        student4.write_programs(12)
        self.assertEqual(student4.programs_written, 12)
        student4.write_programs()
        self.assertEqual(student4.programs_written,13)

注意:这是用Python 3.6编写的

因此,我假设您希望重新编写str()以输出自定义文本。我已经剥离了演示这个示例不需要的无关代码。这就是我所拥有的:

class Student:
    def __init__(self, name, years_in_school=1):
        self.name = name
        self.years_school = years_in_school
        self.programs_written = 0

    def __str__(self):
        return ("My name is {}, I've been in college for {} years and I've written {} programs!".format(
                self.name, self.years_school, self.programs_written
    ))
首先,让我们把一些事情分解一下。在你的init()中,你的“学校年数”被分配给“学校年数”,为什么不让它们相同呢?这里真的没有必要有两个不同的变量。这样做:

class Student:
    def __init__(self, name, years_in_school=1):
        self.name = name
        self.years_in_school = years_in_school
        self.programs_written = 0
它可以是相同的名称,这是执行初始化时的惯例。我已经使代码与您所写的完全匹配,因为我不知道您对此的意图,所以我发现最好不要对上面的示例进行更改

现在,让我们看一下实现您所需的代码。因此,我们设置str()以准确返回您要求的内容,并使用您在init()中创建的变量对其进行格式化。当您创建对象并将其打印出来时,您将确切地看到您要查找的内容

另一种方法是简单地创建一个全新的方法来处理这个问题。您只需创建一个新方法,名为:

show_student(self):
    print("My name is {}, I've been in college for {} years and I've written {} programs!".format(
           self.name, self.years_school, self.programs_written
))
然后,当您调用它时,只需键入:

object_name_goes_here.show_student()
这将是更好的选择,因为现在每当您在重新定义str()时尝试打印时,它都会输出您创建的字符串,而不是您希望打印()执行的操作。老实说,我会使用定义一种新方法来处理这种过度重写str()

希望这对你有所帮助。如果有人知道更好的方法,请告诉我。我总是乐于学习更多东西。有关python控制台中的输出,请参见附图


同样,正如你在一篇评论中所说的,years_UM没有任何作用,因为你没有为它调用变量。您需要将其添加到您的init()中并设置为某个值,或者只需调用years\u school或years\u in\u school(如果您像我上面提到的那样更改代码)。

那么您到底被困在了哪里?似乎没有问题,只需定义一个方法即可获取您所需的内容。您可以轻松地将其格式化为“我的名字是%s。我在大学里呆了%s年,写了%d个程序。”%(self.name,self.years\u school,self.programs\u writed)。另外,您在umich(self)的方法
year\u\u将失败,因为您没有所谓的
years\u UM
。感谢您的建议,我考虑了其中一些建议并调整了代码。然而,当我尝试调用不同的测试值时,我的代码仍然无法工作。有什么想法吗?发布你的更新代码和你用来获取错误的东西,这样我就可以知道发生了什么on@SammySmith因此,这方面的任何进展或。