我试图学习使用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()不带参数(给定1个)"。 在我的观点中,我没有给出任何论据,但我删除了括号,给出了 代码
Steve.list_values
Johnny.list_values
Penny.list_values
这不会产生任何错误,但不会执行任何操作 - 不会打印任何内容。
我的问题:
答案 0 :(得分:1)
Python要求您明确地将self
参数添加到成员函数中,而忘记将self
添加到函数decleration中:
def list_values(self):
这将它定义为Student
类的成员函数。见here。当您将函数作为Student
实例的成员调用时,会隐式添加self
变量,从而触发异常,因为您没有定义接收一个参数的名为list_values
的函数。
至于删除括号,这意味着你不是在调用函数而只是引用函数对象,什么都不做。
答案 1 :(得分:1)
list_values
方法需要绑定到Student实例:
你应该改变:
def list_values()
为:
def list_values(self)
有关原因的解释,请参阅:
Guido的这篇博文也涵盖了这个主题:
答案 2 :(得分:0)
def list_values():
应该是:def list_values(self):
在Python中,实例方法将self
作为第一个参数。
答案 3 :(得分:0)
正如其他人所提到的,您应该在self
中使用list_values
。
但你应该真正定义magic method __str__
或__repr__
中的一个。此外,您还需要设置一些不必要的class properties。
更简单的实现方式是:
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>
由于您没有定义特殊方法,因此您也可以使用named tuple:
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')