Python OOP练习

时间:2014-04-22 08:10:59

标签: 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()不带参数(给定1个)"。 在我的观点中,我没有给出任何论据,但我删除了括号,给出了 代码

Steve.list_values
Johnny.list_values
Penny.list_values

这不会产生任何错误,但不会执行任何操作 - 不会打印任何内容。

我的问题:

  1. 与括号有什么关系?
  2. 打印报表的处理是什么?

4 个答案:

答案 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')