Python,创建对象

156 投票
4 回答
592047 浏览
提问于 2025-04-17 17:08

我正在学习Python,现在想弄明白类和如何通过实例来操作它们。

我对这个练习题有点困惑:

创建并返回一个学生对象,这个对象的名字、年龄和专业要和输入的值一样。

def make_student(name, age, major)

我就是不明白这里说的“对象”是什么意思。他们是让我在这个函数里创建一个数组来存这些值吗?还是说要创建一个类,把这个函数放在里面,然后再创建实例?(在这个问题之前,我被要求设置一个包含名字、年龄和专业的学生类。)

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

相关问题:

4 个回答

34

对象是类的实例。类就像是对象的蓝图。所以根据你的类定义 -

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

你可以通过明确地给一个新的 Student 实例分配属性来创建一个 make_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})()
59

创建一个类,并给它一个 __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__ 做的事情是一样的。

192
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这样的文档数据库时。

撰写回答