150

我正在尝试学习python,现在我正在尝试掌握类以及如何使用实例来操作它们。

我似乎无法理解这个练习问题:

创建并返回一个学生对象,其姓名、年龄和专业与作为输入的相同

def make_student(name, age, major)

我只是不明白对象的含义,它们是否意味着我应该在保存这些值的函数内创建一个数组?或者创建一个类并让这个函数在里面,并分配实例?(在这个问题之前,我被要求建立一个学生班级,里面有名字、年龄和专业)

class Student:
    name = "Unknown name"
    age = 0
    major = "Unknown major"
4

4 回答 4

189
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 make_student(name, age, major):
    student = Student(name, age, major)
    return student

请注意,尽管 Python 哲学中的一个原则是“应该有一种——最好只有一种——明显的方式来做到这一点”,但仍然有多种方式可以做到这一点。您还可以使用以下两个代码片段来利用 Python 的动态功能:

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

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    # Note: I didn't need to create a variable in the class definition before doing this.
    student.gpa = float(4.0)
    return student

我更喜欢前者,但在某些情况下后者可能很有用——例如在使用 MongoDB 等文档数据库时。

于 2013-02-26T04:58:29.860 回答
54

创建一个类并给它一个__init__方法:

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

    def is_old(self):
        return self.age > 100

现在,您可以初始化Student该类的一个实例:

>>> s = Student('John', 88, None)
>>> s.name
    'John'
>>> s.age
    88

虽然我不确定make_student如果它与Student.__init__.

于 2013-02-26T04:51:35.450 回答
30

对象是类的实例。类只是对象的蓝图。因此,鉴于您的班级定义-

# Note the added (object) - this is the preferred way of creating new classes
class Student(object):
    name = "Unknown name"
    age = 0
    major = "Unknown major"

make_student您可以通过将属性显式分配给以下新实例来创建函数Student-

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

但在构造函数 ( __init__) 中执行此操作可能更有意义 -

class Student(object):
    def __init__(self, name="Unknown name", age=0, major="Unknown major"):
        self.name = name
        self.age = age
        self.major = major

使用时调用构造函数Student()。它将采用__init__方法中定义的参数。构造函数签名现在基本上是Student(name, age, major).

如果你使用它,那么一个make_student函数是微不足道的(而且是多余的) -

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

为了好玩,这里是一个如何在make_student不定义类的情况下创建函数的示例。请不要在家里尝试这个。

def make_student(name, age, major):
    return type('Student', (object,),
                {'name': name, 'age': age, 'major': major})()
于 2013-02-26T05:05:04.737 回答
3

当您使用预定义类创建对象时,首先您要创建一个变量来存储该对象。然后您可以创建对象并存储您创建的变量。

class Student:
     def __init__(self):

# creating an object....

   student1=Student()

实际上这个init方法是类的构造函数。你可以使用一些属性来初始化那个方法。在这一点上,当你创建一个对象时,你将不得不为特定属性传递一些值。

class Student:
      def __init__(self,name,age):
            self.name=value
            self.age=value

 # creating an object.......

     student2=Student("smith",25)
于 2018-06-28T17:14:43.860 回答