Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,创建对象_Python - Fatal编程技术网

Python,创建对象

Python,创建对象,python,Python,我正在尝试学习python,现在我正在尝试掌握类的诀窍以及如何使用实例操纵它们 我似乎无法理解这个练习问题: 创建并返回一个学生对象,其名称、年龄和专业为 与输入相同 def make_student(name, age, major) 我只是不明白object的意思,他们是说我应该在函数中创建一个数组来保存这些值吗?或者创建一个类,让这个函数在其中,并分配实例?(在这个问题之前,我被要求建立一个学生班,里面有姓名、年龄和专业) 创建一个类并给它一个\uuuuu init\uuuu方法: cl

我正在尝试学习python,现在我正在尝试掌握类的诀窍以及如何使用实例操纵它们

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

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

def make_student(name, age, major)
我只是不明白object的意思,他们是说我应该在函数中创建一个数组来保存这些值吗?或者创建一个类,让这个函数在其中,并分配实例?(在这个问题之前,我被要求建立一个学生班,里面有姓名、年龄和专业)


创建一个类并给它一个
\uuuuu init\uuuu
方法:

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\u student
student函数,如果它与
student做的事情相同

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之类的文档数据库时

对象是类的实例。类只是对象的蓝图。根据你的类定义-

# 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
-

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    return student
但在构造函数中这样做可能更有意义(
\uuuuu init\uuuu
)-

使用
Student()
时将调用构造函数。它将采用
\uuuu init\uuu
方法中定义的参数。构造函数签名现在基本上是
学生(姓名、年龄、专业)

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

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

def make_student(name, age, major):
    return type('Student', (object,),
                {'name': name, 'age': age, 'major': major})()

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

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)

阅读数据模型文档,特别是
\uuuuu init\uuuuu
方法与此相关:None(无引号)是pythonOur中常见的未赋值默认值。老师给了我们一个test.py程序,测试我们是否正确处理了问题。这个问题想让我具体使用make_student函数。最终的目标是:s1=成为一名学生(姓名、年龄、专业),现在我把所有的东西都分配给了s1。但我还是不确定他们想要什么?我可以用数组{'name':name..etc}来实现这一点,但这并没有给我一个正确的答案,所以我假设我需要实现我从类和实例中学到的东西所谓的“工厂方法”模式,即使用方法或函数来创建某种对象而不是直接在代码中创建它们的模式,是一种有用的模式,例如,它允许您利用继承的优点。查一查;)实际上,出于冗长的原因,我不喜欢使用类名(object)。Python文档往往做得不好。不过,我喜欢在口述中进食的“危险”例子。我收回我先前的评论。看见因此,实际上有一个解释类名(object)的理由:python中没有构造函数:)方法与构造函数有何不同?
\uuuuu init\uuuu
不是构造函数,“因为在调用
\uuuu init\uuuu
时对象已经被构造,并且您已经有了一个对类的新实例的有效引用。”()为什么您要在初始化之前将它们初始化为类变量?(好奇;没有经常看到这种模式)出于可读性目的。通过将类变量放在init之前的顶部附近,我可以快速看到哪些变量在类范围内,因为它们可能不是全部由构造函数设置的。在这里,作为类Student实例的对象的名称将保持Student对吗?如果每次调用时需要多个对象,该怎么办名称student01、student02等等?创建类变量以查看实例变量是一种糟糕的做法。对于任何新手读者来说:请看@pyrospade的答案。您的示例具有误导性。请使用类变量名称,这实际上是所有学生的属性,而不是误用每个学生的属性。For示例:使用
class Unicorn
has_hooves=True
代替
name=”“
def make_student(name, age, major):
    return type('Student', (object,),
                {'name': name, 'age': age, 'major': major})()
class Student:
     def __init__(self):

# creating an object....

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

 # creating an object.......

     student2=Student("smith",25)