Python面向对象编程练习
我正在学习如何在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
这样没有出现错误,但也没有任何输出——什么都没有打印出来。
我有几个问题:
- 括号是怎么回事?
- 打印语句又是怎么回事?
4 个回答
在Python中,def list_values():
这个写法是不对的,应该改成 def list_values(self):
。
因为在Python里,实例方法的第一个参数必须是 self
,这个参数代表了类的实例,也就是你创建的对象。
正如其他人提到的,你在 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')
在Python中,你需要在成员函数里明确地加上self
这个参数。你忘了在你的函数声明里加self
了:
def list_values(self):
这样做是为了把它定义为Student
类的一个成员函数。你可以在这里查看相关内容。当你以Student
实例的成员来调用这些函数时,self
这个变量会自动被添加进去,这样就会出现异常,因为你没有定义一个叫list_values
的函数来接收一个参数。
至于去掉括号,这意味着你并不是在调用这些函数,而只是简单地提到这些函数对象,这样是不会做任何事情的。
这个 list_values
方法需要和你的学生实例绑定在一起:
你应该把:
def list_values()
改成:
def list_values(self)
想知道为什么这样做,可以看看:
还有Guido写的这篇博客也讲了这个话题: