Diego Asked: 2020-06-18 11:49:40 +0800 CST 2020-06-18 11:49:40 +0800 CST 2020-06-18 11:49:40 +0800 CST 怀疑班级。__init__ 是做什么用的? 772 我从这个编程开始,我正在进入 OOP。在 python 中,为什么在类中放置__init__?这听起来可能很愚蠢,但是既然可以使用函数,为什么还要使用类呢? python 3 Answers Voted FJSevilla 2020-06-18T13:30:57+08:002020-06-18T13:30:57+08:00 该方法__init__是一种特殊的方法,大致相当于其他语言中所谓的构造函数。它的主要作用是对象一被实例化就在对象中建立一个初始状态,即初始化属性。 前段时间我__init__对它及其在 Python 中的功能做了一个相当广泛的回答,我给你留下了链接,以免重复同样的事情: 什么是构造函数? 至于你的第二个问题,为什么不总是使用结构化编程而不用这个类的东西使我们的生活复杂化? 好吧,你必须从不使你的生活不必要地复杂化的前提开始,OOP 并不总是最好的选择,如果我想创建一个返回数字立方的函数,这没有多大意义(简单明了)开始创建一个类,使用它的方法,实例化它等等。 但是,创建 OOP 并不是为了让我们受苦,在某些情况下它非常有用,而在其他情况下它几乎是必不可少的,例如在创建图形界面或视频游戏时。在结构化编程方面,OOP 有很多好处和不同之处,但深入了解这一点是永无止境的。 在 OOP 中,一切都围绕objeto. 对象是具有特定状态、行为(方法)和身份的实体。OOP 中的一个对象与现实世界的“对象”并没有太大区别,例如,一个人有某种状态(我正在写这个),一种行为(作为一个人,我可以走路,喝酒,睡觉,无聊,写这篇文章是为了避免无聊 XD 等)并且我有一个身份(我是我,没有其他人......)。 对象(实例)的状态由其定义atributos。它们只不过是描述对象当前状态的数据(变量)。 行为由方法指定。这些方法允许对象做某事(走路、写字、开机等)。 身份是实例的一个属性,它允许它与任何其他实例区分开来。一个对象总是可以区分的,即使对于同一类的对象也是如此。 在结构化编程中,过程和数据是分开的,不相关的,因为唯一需要的是处理一些输入数据以获得其他输出数据。这个想法很简单,我有一些数据,我想获取其他数据,为此我创建了一个函数,我将它传递给他们并返回我的新数据。在 OOP 中,状态(数据)没有与方法(过程)分离,如果我们将他们的状态和方法分开,人的概念就没有意义。如果那个人处于昏迷状态,有很多方法(人类可以为成为人类而做的事情)他们将无法做到,如果我的腿骨折了,走路(方法)是不一样的(状态)好像不是…… 也就是说,在 OOP 中,我们首先定义一个对象,然后要求它自己做某事。 在这一段之后,一个实际的例子说明了为什么 OOP 存在。正如我在创建图形用户界面时提到的,这个概念非常重要。GUI 中一个非常常见的东西是按钮。我们将需要很多按钮,每个按钮都有不同的方式(颜色、文本、点击操作等)。如果我们需要 200 个按钮,我们可以通过从头开始创建每个按钮来自娱自乐,每个按钮都有自己的功能,但最终还是死路一条。然后 OOP 像救世主一样来到我们身边,告诉我们:创建一个 Button 类,定义它的属性(文本、大小、颜色等)以及它可以做的事情(单击、重新启动、更改颜色、从视图中消失等) )。然后通过实例化类并赋予每个按钮自己的个性(但仍然是按钮)来创建 200 个按钮。作为一个愚蠢的例子: class Boton(): def __init__(self, texto = 'Botón', color = 'Azul', accion = None): self.texto = texto self.color = color self.accion = accion self.habilitado = True def pulsar(self): if self.accion: if self.habilitado: self.accion() else: print('Estoy desactivado, déjame en paz....') def deshabilitar(self): self.habilitado = False def habilitar(self): self.habilitado = True 这个例子很简单但是很好,让我们看看这是否能理解。现在我可以毫不费力地创建我想要的按钮,我只是实例化它们: def holaMundo(): print('Hola mundo') def opinion(): print('Odio la POO... ¿Que m****a es esto?') boton1 = Boton(accion = opinion) boton2 = Boton(texto = 'Hola', accion = holaMundo) 现在我有两个按钮,两个都不同,都做一个按钮应该做的事情: >>> boton1.pulsar() Odio la POO... ¿Que m****a es esto? >>> boton2.pulsar() Hola mundo >>> boton2.deshabilitar() >>> boton2.pulsar() Estoy desactivado, déjame en paz.... >>> boton2.habilitar() >>> boton2.pulsar() Hola mundo 这个例子很简单,但很接近现实。请注意,按钮不限于执行功能,而是根据其状态(在这种情况下,它是否被禁用)以不同的方式起作用。在实际实现中,这要复杂得多,想象一下在没有 OOP 的情况下执行此操作,您可以尝试... 当您使用 Python 时,您会在不知不觉中多次使用它。列表只不过是一个类,它有它的属性(如内容)和它的方法(排序、弹出、追加等)。做miLista = [1,2,3]无非就是实例化类List并创建一个初始状态。如果我们myLista.append(4)使用其中一种方法,列表可以增长并存储另一个元素。 继续我的宏伟类比,当一个人出生(被实例化)时,他会通过一系列将他与其他人区分开来的特征(属性)出生,例如头发颜色、眼睛颜色、性别等。该方法__init__做同样的事情,一旦一个对象诞生,它通过修改它的属性赋予它一系列自己的特性。这听起来很傻,但这是 OOP 的思维方式,它与我们构建现实世界的方式非常相似。 好吧,我将它留在这里,作为类的对象,SerHumano我执行该方法dejar_de_dar_la_brasa()并将我的属性传递回aburrido... TrueXD Best Answer Jorge Arturo Juarez 2020-06-18T13:24:56+08:002020-06-18T13:24:56+08:00 类是生成对象的方式,OOP 是面向对象的编程,如果你想使用这种范式你必须考虑对象和类。 一个类定义了一种对象,当你调用它时,你正在创建该类的实例,当你想要某事发生时,你调用该对象并告诉它去做。 __init__是您的类的构造函数,您可以在其中创建类的新实例,例如 class perro(): def __init__(self, nombre, size, raza): self.nombre=nombre self.size=size self.raza=raza def ladra(self): s="" for l in self.nombre: s+="wof" print s chucho=perro("chucho","grande","husky") chucho.ladra() #wofwofwofwofwofwof cloe=perro("cloe","mini","chihuahua") cloe.ladra() #wofwofwofwof 可以使用函数的时候为什么要使用对象,以免混淆几个相似的对象。 假设一个机器人处理 20 个客户,您不希望机器人回答客户 20 的客户 18 的问题,因此您创建 20 个机器人对象并为每个对象分配一个客户。 在游戏中,您想创建 100 个敌人,每个敌人的行为方式相似,但您希望每个敌人都具有区分它们的特征,因此您创建了敌人类并实现了区分它们的特征。 OOP 应该是在飞行模拟器开始在模拟中区分一架飞机与另一架飞机时创建的。 Mario Rodriguez 2020-12-13T11:37:21+08:002020-12-13T11:37:21+08:00 我是一般编程的初学者,因此也是 python 的初学者。 初学者提出明显“愚蠢”的问题,因为我们在一行代码中看到的每个符号、字母、组合,我们根本不理解,因为一切对我们来说都是新的。 当我读到这样一个简单问题的复杂答案时,我意识到,我不知道为什么,但这就像用简单的东西回答简单的事情变得复杂。 我认为这个男孩想知道的就是我想知道的,现在他告诉我我已经理解了,我不明白的是为什么它没有在任何地方直接解释,也没有那么多“滚动” __init__以实用的方式工作,事实是它很疯狂,因为它很愚蠢,但我只在各种论坛和 5 页的互联网文章中看到大量扭曲的答案,最终与开始时相同。 对我来说,解释在类中使用“__init__”的直接答案是这样的: 当您创建一个旨在从中生成许多对象(类的实例)的类时,这些对象总是具有某些共同特征,在创建使用该类创建的每个对象时节省工作的最简单方法是这些对象在您创建的具有默认特性(属性)和值(参数),因此您不必在每次创建对象时都将这些特性分配给对象。 当您在类中使用__init__函数时,您正在定义创建的对象将具有的默认属性和参数。 这里我用一个例子来解释: 如果您创建车辆类并从中创建 2000 辆车辆(对象汽车),并且您知道默认情况下,使用该类创建的大多数车辆对象可能有四个轮子,它们将是 SUV,它们将有一个柴油发动机和 ABS,因为你在类中定义了__init__函数,这些将是使用该类创建该对象时该对象将具有的默认特征,实际上: class vehiculo(): def __init__(self, ruedas = 4, modelo = "SUV", motor = "diesel", ABS = True): self.ruedas = ruedas self.modelo = modelo self.motor = motor self.ABS = ABS (“self”基本上是从类本身创建的对象,这就是他们称之为的原因,我认为如果以这种方式使用“object.wheels = Wheels”这个词会更好地理解) 现在,我从车辆类中创建我称为 car_1 的对象,如下所示: coche_1 = vehiculo() 如果我想知道这辆车有多少个轮子,我可以打印(对象)有多少个轮子,4 个会出来: >>>print (coche_1.ruedas) 4 如果我想知道这辆车是否有 ABS,(它会出来 True): >>>print (coche.ABS) True 因为这是我在车辆类中使用__init__函数定义的。也就是说 ,对象将使用这些参数进行__init__cialized(创建)。 现在,如果现在我想创建一辆没有 ABS 的汽车(因为我想看看它在弯道制动时如何在雨中滑行)然后我创建一辆汽车(对象)并像这样移除 ABS: coche_2 = vehiculo(ABS = False) 所以现在我有一辆没有 ABS 的汽车(请记住,如果我什么都不说,默认情况下,新对象汽车将有 ABS),我像这样检查它: >>> print(coche_2.ABS) False 如果我想创建一辆带有电动机而不是默认柴油的汽车,我可以这样创建它: coche_3 = vehiculo(motor = "electrico") 当打印那辆车的那个特性时,它会显示它是电动的: >>> print(coche_3.motor) electrico 我花了一周的时间才理解了这个胡说八道,因为像我这样的凡人没有任何解释,我一定是我很愚蠢或者其他人很聪明,我不知道。 创建函数时调用“def”而不是“fun”不会让事情变得更容易(也许“fun”很有趣,程序员必须看起来很认真)。 “自我”这件事也是另一个笑话,它使在类中初始化一个对象似乎是只有在 NASA 工作的人才能理解的事情。如果不称其为“自我”,而是称其为“对象”,那将是不言自明的,每个人都可以理解它而无需解释…… 无论如何,当我理解完所有内容后,我会写一些我称之为的书或一些教程,它将以简单的方式解释简单的事情,而不是没有上帝理解的 14 页答案。 阿门
该方法
__init__
是一种特殊的方法,大致相当于其他语言中所谓的构造函数。它的主要作用是对象一被实例化就在对象中建立一个初始状态,即初始化属性。前段时间我
__init__
对它及其在 Python 中的功能做了一个相当广泛的回答,我给你留下了链接,以免重复同样的事情:什么是构造函数?
至于你的第二个问题,为什么不总是使用结构化编程而不用这个类的东西使我们的生活复杂化?
好吧,你必须从不使你的生活不必要地复杂化的前提开始,OOP 并不总是最好的选择,如果我想创建一个返回数字立方的函数,这没有多大意义(简单明了)开始创建一个类,使用它的方法,实例化它等等。
但是,创建 OOP 并不是为了让我们受苦,在某些情况下它非常有用,而在其他情况下它几乎是必不可少的,例如在创建图形界面或视频游戏时。在结构化编程方面,OOP 有很多好处和不同之处,但深入了解这一点是永无止境的。
在 OOP 中,一切都围绕
objeto
. 对象是具有特定状态、行为(方法)和身份的实体。OOP 中的一个对象与现实世界的“对象”并没有太大区别,例如,一个人有某种状态(我正在写这个),一种行为(作为一个人,我可以走路,喝酒,睡觉,无聊,写这篇文章是为了避免无聊 XD 等)并且我有一个身份(我是我,没有其他人......)。对象(实例)的状态由其定义
atributos
。它们只不过是描述对象当前状态的数据(变量)。行为由方法指定。这些方法允许对象做某事(走路、写字、开机等)。
身份是实例的一个属性,它允许它与任何其他实例区分开来。一个对象总是可以区分的,即使对于同一类的对象也是如此。
在结构化编程中,过程和数据是分开的,不相关的,因为唯一需要的是处理一些输入数据以获得其他输出数据。这个想法很简单,我有一些数据,我想获取其他数据,为此我创建了一个函数,我将它传递给他们并返回我的新数据。在 OOP 中,状态(数据)没有与方法(过程)分离,如果我们将他们的状态和方法分开,人的概念就没有意义。如果那个人处于昏迷状态,有很多方法(人类可以为成为人类而做的事情)他们将无法做到,如果我的腿骨折了,走路(方法)是不一样的(状态)好像不是……
也就是说,在 OOP 中,我们首先定义一个对象,然后要求它自己做某事。
在这一段之后,一个实际的例子说明了为什么 OOP 存在。正如我在创建图形用户界面时提到的,这个概念非常重要。GUI 中一个非常常见的东西是按钮。我们将需要很多按钮,每个按钮都有不同的方式(颜色、文本、点击操作等)。如果我们需要 200 个按钮,我们可以通过从头开始创建每个按钮来自娱自乐,每个按钮都有自己的功能,但最终还是死路一条。然后 OOP 像救世主一样来到我们身边,告诉我们:创建一个 Button 类,定义它的属性(文本、大小、颜色等)以及它可以做的事情(单击、重新启动、更改颜色、从视图中消失等) )。然后通过实例化类并赋予每个按钮自己的个性(但仍然是按钮)来创建 200 个按钮。作为一个愚蠢的例子:
这个例子很简单但是很好,让我们看看这是否能理解。现在我可以毫不费力地创建我想要的按钮,我只是实例化它们:
现在我有两个按钮,两个都不同,都做一个按钮应该做的事情:
这个例子很简单,但很接近现实。请注意,按钮不限于执行功能,而是根据其状态(在这种情况下,它是否被禁用)以不同的方式起作用。在实际实现中,这要复杂得多,想象一下在没有 OOP 的情况下执行此操作,您可以尝试...
当您使用 Python 时,您会在不知不觉中多次使用它。列表只不过是一个类,它有它的属性(如内容)和它的方法(排序、弹出、追加等)。做
miLista = [1,2,3]
无非就是实例化类List
并创建一个初始状态。如果我们myLista.append(4)
使用其中一种方法,列表可以增长并存储另一个元素。继续我的宏伟类比,当一个人出生(被实例化)时,他会通过一系列将他与其他人区分开来的特征(属性)出生,例如头发颜色、眼睛颜色、性别等。该方法
__init__
做同样的事情,一旦一个对象诞生,它通过修改它的属性赋予它一系列自己的特性。这听起来很傻,但这是 OOP 的思维方式,它与我们构建现实世界的方式非常相似。好吧,我将它留在这里,作为类的对象,
SerHumano
我执行该方法dejar_de_dar_la_brasa()
并将我的属性传递回aburrido
...True
XD类是生成对象的方式,OOP 是面向对象的编程,如果你想使用这种范式你必须考虑对象和类。
一个类定义了一种对象,当你调用它时,你正在创建该类的实例,当你想要某事发生时,你调用该对象并告诉它去做。
__init__
是您的类的构造函数,您可以在其中创建类的新实例,例如可以使用函数的时候为什么要使用对象,以免混淆几个相似的对象。
假设一个机器人处理 20 个客户,您不希望机器人回答客户 20 的客户 18 的问题,因此您创建 20 个机器人对象并为每个对象分配一个客户。
在游戏中,您想创建 100 个敌人,每个敌人的行为方式相似,但您希望每个敌人都具有区分它们的特征,因此您创建了敌人类并实现了区分它们的特征。
OOP 应该是在飞行模拟器开始在模拟中区分一架飞机与另一架飞机时创建的。
我是一般编程的初学者,因此也是 python 的初学者。
初学者提出明显“愚蠢”的问题,因为我们在一行代码中看到的每个符号、字母、组合,我们根本不理解,因为一切对我们来说都是新的。
当我读到这样一个简单问题的复杂答案时,我意识到,我不知道为什么,但这就像用简单的东西回答简单的事情变得复杂。
我认为这个男孩想知道的就是我想知道的,现在他告诉我我已经理解了,我不明白的是为什么它没有在任何地方直接解释,也没有那么多“滚动” __init__以实用的方式工作,事实是它很疯狂,因为它很愚蠢,但我只在各种论坛和 5 页的互联网文章中看到大量扭曲的答案,最终与开始时相同。
对我来说,解释在类中使用“__init__”的直接答案是这样的:
当您创建一个旨在从中生成许多对象(类的实例)的类时,这些对象总是具有某些共同特征,在创建使用该类创建的每个对象时节省工作的最简单方法是这些对象在您创建的具有默认特性(属性)和值(参数),因此您不必在每次创建对象时都将这些特性分配给对象。
当您在类中使用__init__函数时,您正在定义创建的对象将具有的默认属性和参数。
这里我用一个例子来解释:
如果您创建车辆类并从中创建 2000 辆车辆(对象汽车),并且您知道默认情况下,使用该类创建的大多数车辆对象可能有四个轮子,它们将是 SUV,它们将有一个柴油发动机和 ABS,因为你在类中定义了__init__函数,这些将是使用该类创建该对象时该对象将具有的默认特征,实际上:
(“self”基本上是从类本身创建的对象,这就是他们称之为的原因,我认为如果以这种方式使用“object.wheels = Wheels”这个词会更好地理解)
现在,我从车辆类中创建我称为 car_1 的对象,如下所示:
如果我想知道这辆车有多少个轮子,我可以打印(对象)有多少个轮子,4 个会出来:
如果我想知道这辆车是否有 ABS,(它会出来 True):
因为这是我在车辆类中使用__init__函数定义的。也就是说 ,对象将使用这些参数进行__init__cialized(创建)。
现在,如果现在我想创建一辆没有 ABS 的汽车(因为我想看看它在弯道制动时如何在雨中滑行)然后我创建一辆汽车(对象)并像这样移除 ABS:
所以现在我有一辆没有 ABS 的汽车(请记住,如果我什么都不说,默认情况下,新对象汽车将有 ABS),我像这样检查它:
如果我想创建一辆带有电动机而不是默认柴油的汽车,我可以这样创建它:
当打印那辆车的那个特性时,它会显示它是电动的:
我花了一周的时间才理解了这个胡说八道,因为像我这样的凡人没有任何解释,我一定是我很愚蠢或者其他人很聪明,我不知道。
创建函数时调用“def”而不是“fun”不会让事情变得更容易(也许“fun”很有趣,程序员必须看起来很认真)。
“自我”这件事也是另一个笑话,它使在类中初始化一个对象似乎是只有在 NASA 工作的人才能理解的事情。如果不称其为“自我”,而是称其为“对象”,那将是不言自明的,每个人都可以理解它而无需解释……
无论如何,当我理解完所有内容后,我会写一些我称之为的书或一些教程,它将以简单的方式解释简单的事情,而不是没有上帝理解的 14 页答案。
阿门