Python,创建对象

Moh*_*eed 119 python

我正在尝试学习python,我现在正试图获得类的挂起以及如何使用实例操作它们.

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

创建并返回其名称,年龄和专业与输入相同的学生对象

def make_student(name, age, major)
Run Code Online (Sandbox Code Playgroud)

我只是没有得到对象的含义,它们是否意味着我应该在包含这些值的函数内创建一个数组?或创建一个类,让这个函数在其中,并分配实例?(在这个问题之前,我被要求建立一个名字,年龄和内部专业的学生班)

class Student:
    name = "Unknown name"
    age = 0
    major = "Unknown major"
Run Code Online (Sandbox Code Playgroud)

Wul*_*ram 161

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
Run Code Online (Sandbox Code Playgroud)

请注意,尽管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
Run Code Online (Sandbox Code Playgroud)

我更喜欢前者,但有些情况下后者可能很有用 - 一个是在使用像MongoDB这样的文档数据库时.

  • 为什么要在init之前将它们初始化为类变量?(好奇;经常没见过那种模式) (17认同)
  • 创建类变量以查看实例变量是多么糟糕的做法.对于任何新手读者:请查看@ pyrospade的答案. (8认同)
  • 出于可读性目的.通过将类变量放在init之前的顶部附近,我可以快速查看哪些变量在类范围内,因为它们可能并非都由构造函数设置. (7认同)
  • 你的例子有误导性。请使用实际上是所有学生的属性的类变量名称,而不是滥用每个学生的属性。例如:使用`class Unicorn` 和`has_hooves = True` 代替`name = ""`。 (2认同)

Ble*_*der 47

创建一个类并给它一个__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
Run Code Online (Sandbox Code Playgroud)

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

>>> s = Student('John', 88, None)
>>> s.name
    'John'
>>> s.age
    88
Run Code Online (Sandbox Code Playgroud)

虽然我不确定为什么你需要一个make_student学生功能,如果它做同样的事情Student.__init__.


pyr*_*ade 24

对象是类的实例.类只是对象的蓝图.所以鉴于你的班级定义 -

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

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

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    return student
Run Code Online (Sandbox Code Playgroud)

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

class Student(object):
    def __init__(self, name="Unknown name", age=0, major="Unknown major"):
        self.name = name
        self.age = age
        self.major = major
Run Code Online (Sandbox Code Playgroud)

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

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

def make_student(name, age, major):
    return Student(name, age, major)
Run Code Online (Sandbox Code Playgroud)

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

def make_student(name, age, major):
    return type('Student', (object,),
                {'name': name, 'age': age, 'major': major})()
Run Code Online (Sandbox Code Playgroud)

  • 我撤回我之前的评论。请参阅 http://stackoverflow.com/questions/4015417/python-class-inherits-object。所以实际上有一个理由拼出 class Name(object): (2认同)
  • python 中没有构造函数:) (2认同)