Python,创建对象
我正在学习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这样的文档数据库时。