Python面向对象编程练习

1 投票
4 回答
4148 浏览
提问于 2025-04-18 03:42

我正在学习如何在Python中使用类,并写了一个测试程序。这个程序在某种程度上是基于我在Stack Overflow上看到的另一个问题中的代码。

代码大致如下:

class Student(object):
    name = ""
    age = 0
    major = ""

    # The class "constructor" - It's actually an initializer 
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major
    def list_values():
        print "Name: ", self.name
        print "Age: ", self.age
        print "Major: ", self.major

def make_student(name, age, major):
    student = Student(name, age, major)
    return student

print "A list of students."
Steve = make_student("Steven Schultz",23,"English")
Johnny = make_student("Jonathan Rosenberg",24,"Biology")
Penny = make_student("Penelope Meramveliotakis",21,"Physics")
Steve.list_values()
Johnny.list_values()
Penny.list_values()

当我运行这个程序时,出现了一个错误:“TypeError: list_values() takes no arguments (1 given)”。在我看来,我并没有传递任何参数,但我去掉了括号,代码变成了:

Steve.list_values
Johnny.list_values
Penny.list_values

这样没有出现错误,但也没有任何输出——什么都没有打印出来。

我有几个问题:

  1. 括号是怎么回事?
  2. 打印语句又是怎么回事?

4 个回答

0

在Python中,def list_values(): 这个写法是不对的,应该改成 def list_values(self):

因为在Python里,实例方法的第一个参数必须是 self,这个参数代表了类的实例,也就是你创建的对象。

0

正如其他人提到的,你在 list_values 中应该使用 self

不过,你其实应该定义一个特殊的方法,叫做 __str____repr__。另外,你设置了一些不必要的 类属性

一个更简单的实现方式是:

class Student(object):

    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major

    def __str__(self):
        fs = "<name: {}, age: {}, major: {}>"
        return fs.format(self.name, self.age, self.major)

使用方法如下:

In [9]: Steve = Student("Steven Schultz", 23, "English")

In [10]: Johnny = Student("Jonathan Rosenberg", 24, "Biology")

In [11]: Penny = Student("Penelope Meramveliotakis", 21, "Physics")

In [12]: print Steve
<name: Steven Schultz, age: 23, major: English>

In [13]: print Johnny
<name: Jonathan Rosenberg, age: 24, major: Biology>

In [14]: print Penny
<name: Penelope Meramveliotakis, age: 21, major: Physics>

因为你没有定义特殊的方法,所以你可以考虑使用 命名元组

In [16]: from collections import namedtuple

In [17]: Student = namedtuple('Student', ['name', 'age', 'major'])

In [18]: Steve = Student("Steven Schultz", 23, "English")

In [19]: print Steve
Student(name='Steven Schultz', age=23, major='English')
1

在Python中,你需要在成员函数里明确地加上self这个参数。你忘了在你的函数声明里加self了:

def list_values(self):

这样做是为了把它定义为Student类的一个成员函数。你可以在这里查看相关内容。当你以Student实例的成员来调用这些函数时,self这个变量会自动被添加进去,这样就会出现异常,因为你没有定义一个叫list_values的函数来接收一个参数。

至于去掉括号,这意味着你并不是在调用这些函数,而只是简单地提到这些函数对象,这样是不会做任何事情的。

1

这个 list_values 方法需要和你的学生实例绑定在一起:

你应该把:

def list_values()

改成:

def list_values(self)

想知道为什么这样做,可以看看:

还有Guido写的这篇博客也讲了这个话题:

撰写回答