广告
返回顶部
首页 > 资讯 > 后端开发 > Python >关于Python中的__init__()方法介绍
  • 253
分享到

关于Python中的__init__()方法介绍

pythonmicrosoft开发语言 2023-09-25 09:09:05 253人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文主要介绍了python中的__init__()方法,__init__()方法是Python学习当中重要的基础知识,需要的朋友可以参考下 __init__()方法意义重大的原因有两个。第一个原因是在对象生命周期中初始化是最重要的一步;

本文主要介绍了python中的__init__()方法,__init__()方法是Python学习当中重要的基础知识,需要的朋友可以参考下

__init__()方法意义重大的原因有两个。第一个原因是在对象生命周期中初始化是最重要的一步;每个对象必须正确初始化后才能正常工作。第二个原因是__init__()参数值可以有多种形式。

因为有很多种方式为__init__()提供参数值,对于对象创建有大量的用例,我们可以看看其中的几个。我们想尽可能的弄清楚,因此我们需要定义一个初始化来正确的描述问题区域。

在我们接触__init__()方法之前,无论如何,我们都需要粗略、简单地看看在Python中隐含的object类的层次结构。

在这一章,我们看看不同形式的简单对象的初始化(例如:打牌)。在这之后,我们还可以看看更复杂的对象,就像包含集合的hands对象以及包含策略和状态的players。
隐含的超类——object

每一个Python类都隐含了一个超类:object。它是一个非常简单的类定义,几乎不做任何事情。我们可以创建object的实例,但是我们不能用它做太多,因为许多特殊的方法容易抛出异常。

当我们自定义一个类,object则为超类。下面是一个类定义示例,它使用新的名称简单的继承了object:

1

2

class X:

  pass

下面是和自定义类的一些交互:

1

2

3

4

>>> X.__class__

<class 'type'>

>>> X.__class__.__base__

<class 'object'>

我们可以看到该类是type类的一个对象,且它的基类为object。

就像在每个方法中看到的那样,我们也看看从object继承的默认行为。在某些情况下,超类特殊方法的行为是我们所想要的。在其他情况下,我们需要覆盖这个特殊方法。
基类对象的init()方法

对象生命周期的基础是创建、初始化和销毁。我们将创建和销毁的高级特殊方法推迟到后面的章节中,目前只关注初始化。

所有类的超类object,有一个默认包含pass的__init__()实现,我们不需要去实现__init__()。如果不实现它,则在对象创建后就不会创建实例变量。在某些情况下,这种默认行为是可以接受的。

我们总是给对象添加属性,该对象为基类object的子类。思考以下类,需要两个实例变量但不初始化它们:

1

2

3

class Rectangle:

  def area(self):

    return self.length * self.width

Rectangle类有一个使用两个属性来返回一个值的方法。这些属性没有初始化。这是合法的Python代码。它可以有效的避免专门设置属性,虽然感觉有点奇怪,但是有效。

下面是于Rectangle类的交互:

1

2

3

4

>>> r = Rectangle()

>>> r.length, r.width = 13, 8

>>> r.area()

104

显然这是合法的,但也是容易混淆的根源,所以也是我们需要避免的原因。

无论如何,这个设计给予了很大的灵活性,这样有时候我们不用在__init__()方法中设置所有属性。至此我们走的很顺利。一个可选属性其实就是一个子类,只是没有真正的正式声明为子类。我们创建多态在某种程度上可能会引起混乱以及if语句的不恰当使用所造成的盘绕。虽然未初始化的属性可能是有用的,但很有可能是糟糕设计的前兆。

《Python之禅》中的建议:

    "显式比隐式更好。"

一个__init__()方法应该让实例变量显式。

可怜的多态

灵活和愚蠢就在一念之间。

当我们觉得需要像下面这样写的时候,我们正从灵活的边缘走向愚蠢:

1

if 'x' in self.__dict__:

或者:

1

2

3

try:

  self.x

except AttributeError:

是时候重新考虑api并添加一个通用的方法或属性。重构比添加if语句更明智。
在超类中实现init()

我们通过实现__init__()方法来初始化对象。当一个对象被创建,Python首先创建一个空对象,然后为那个新对象调用__init__()方法。这个方法函数通常用来创建对象的实例变量并执行任何其他一次性处理。

下面是Card类示例定义的层次结构。我们将定义Card超类和三个子类,这三个子类是Card的变种。两个实例变量直接由参数值设置,两个变量通过初始化方法计算:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class Card:

  def __init__(self, rank, suit):

    self.suit = suit

    self.rank = rank

    self.hard, self.soft = self._points()

class NumberCard(Card):

  def _points(self):

    return int(self.rank), int(self.rank)

class AceCard(Card):

  def _points(self):

    return 1, 11

class FaceCard(Card):

  def _points(self):

    return 10, 10

在这个示例中,我们提取__init__()方法到超类,这样在Card超类中的通用初始化可以适用于三个子类NumberCard、AceCard和FaceCard。

这是一种常见的多态设计。每一个子类都提供一个唯一的_points()方法实现。所有子类都有相同的签名:有相同的方法和属性。这三个子类的对象在一个应用程序中可以交替使用。

如果我们为花色使用简单的字符,我们可以创建Card实例,如下所示:

1

cards = [AceCard('A', '?'), NumberCard('2','?'), NumberCard('3','?'),]

我们在列表中枚举出一些牌的类、牌值和花色。从长远来说,我们需要更智能的工厂函数来创建Card实例;用这个方法枚举52张牌无聊且容易出错。在我们接触工厂函数之前,我们看一些其他问题。
使用init()创建显式常量

可以给牌定义花色类。在二十一点中,花色无关紧要,简单的字符串就可以。

我们使用花色构造函数作为创建常量对象的示例。在许多情况下,我们应用中小部分对象可以通过常量集合来定义。小部分的静态对象可能是实现策略模式或状态模式的一部分。

在某些情况下,我们会有一个在初始化或配置文件中创建的常量对象池,或者我们可以基于命令行参数创建常量对象。我们会在第十六章《通过命令进行复制》中获取初始化设计和启动设计的详细信息。

Python没有简单正式的机制来定义一个不可变对象,我们将在第三章《属性访问、方法属性和描述符》看看保证不可变性的相关技术。在本示例中,花色不可变是有道理的。

下面这个类,我们将用于创建四个显式常量:

1

2

3

4

class Suit:

  def __init__(self, name, symbol):

    self.name= name

    self.symbol= symbol

下面是通过这个类创建的常量:

1

Club, Diamond, Heart, Spade = Suit('Club','?'), Suit('Diamond','?'), Suit('Heart','?'), Suit('Spade','?')

现在我们可以通过下面展示的代码片段创建cards:

1

cards = [AceCard('A', Spade), NumberCard('2', Spade), NumberCard('3', Spade),]

这个小示例,这种方法对于单个特性的花色代码来说并不是一个巨大的进步。在更复杂的情况下,会有一些策略或状态对象通过这个方式创建。通过从小的、静态的常量对象中复用可以使策略或状态设计模式更有效率。

我们必须承认,在Python中这些对象并不是技术上一成不变的,它是可变的。进行额外的编码使得这些对象真正不变可能会有一些好处。

转自:微点阅读    https://www.weidianyuedu.com/

来源地址:https://blog.csdn.net/weixin_45707610/article/details/131637978

--结束END--

本文标题: 关于Python中的__init__()方法介绍

本文链接: https://www.lsjlt.com/news/417273.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于Python中的__init__()方法介绍
    本文主要介绍了Python中的__init__()方法,__init__()方法是Python学习当中重要的基础知识,需要的朋友可以参考下 __init__()方法意义重大的原因有两个。第一个原因是在对象生命周期中初始化是最重要的一步;...
    99+
    2023-09-25
    python microsoft 开发语言
  • Python中关于集合的介绍及用法
    一、集合的含义及创建方法 集合(set)是一种无序的并且里面存放不同元素的序列。 集合可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。 创...
    99+
    2023-01-30
    Python
  • 关于Python中的元组介绍
    一、元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。 访问元组: 修改元组:  元组的内置函数count, index:   ...
    99+
    2022-11-12
  • 关于Python中 循环器 itertools的介绍
    目录1、无穷循环器2、函数式工具3、组合工具4、groupby()5、其它工具在for i in iterator结构中,循环器每次返回的对象将赋予给i,直到循环结束。使用iter(...
    99+
    2022-11-12
  • 关于Node.js的events.EventEmitter用法介绍
    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStr...
    99+
    2022-06-04
    js Node EventEmitter
  • Python中关于集合的介绍及用法是什么
    这期内容当中小编将会给大家带来有关Python中关于集合的介绍及用法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  一、集合的含义及创建方法  集合(s...
    99+
    2022-10-18
  • 关于python的对象序列化介绍
    对象:是抽象的概念 如列表 元组 字典 集合 皆为对象 序列化:一种方法。目的:把对象存储在磁盘上(即,将对象转换为字节数据/字符数据)。 这一过程我们借助序列化这一方法实现。 为什...
    99+
    2022-11-13
  • 关于reduce的介绍及用法说明
    目录参数介绍举例说明1.把数组合并为一个对象2.去重3.求和4.求最大值和最小值5.扁平数组6.求字符串中各个字符出现的次数 reduce总的来说用的不多,但最近看一些文章...
    99+
    2022-11-13
  • Python中关于函数的具体用法范例以及介绍
    目录1.函数的介绍2.函数的定义和调用3.函数的参数4.参数的分类4.1.位置参数4.2.关键字参数4.3.缺省参数4.4.不定长参数1.不定长参数*args2.不定长参数* * k...
    99+
    2022-11-12
  • Python中关于文件的具体操作与介绍
    目录文件的介绍文件的打开与关闭1.打开文件2.写数据(write)3.读数据(read)4.读数据(readlines)5.读数据(readline)6.可写 ,追加(a)二进制文件...
    99+
    2022-11-12
  • 关于Python网络爬虫requests库的介绍
    1. 什么是网络爬虫 简单来说,就是构建一个程序,以自动化的方式从网络上下载、解析和组织数据。 就像我们浏览网页的时候,对于我们感兴趣的内容我们会复制粘贴到自己的笔记本中,方便下次阅...
    99+
    2023-05-18
    Python网络爬虫 Python requests库
  • 基于StringBuilder类中的重要方法(介绍)
    下面的API注解包含了StringBuilder类中的重要方法append(boolean b):将 boolean 参数的字符串表示形式追加到序列。append(char c):将 char 参数的字符串表示形式追加到此序列。append...
    99+
    2023-05-31
    stringbuilder类 strin st
  • java中关于对象的详细介绍
    一、对象的创建步骤:(1)声名对象变量:对象变量的声明并没有创建对象,系统只是为该改变量分配一个引用空间。(2)对象的实例化:为对象分配空间,执行new运算符后的构造方法完成对象的初始化,并返回该对象的引用。过程:首先为对象分配内存空间,并...
    99+
    2014-08-23
    java入门 java 对象
  • java中关于scanner类的详细介绍
    1.Scanner的实现步骤第一步:在有效代码的第一行,通过import导入Scanner类!import java.util.Scanner;第二步:通过new关键字实例化一个Scanner对象!Scanner input = new S...
    99+
    2019-01-24
    java入门 java scanner
  • python的特殊方法介绍
    __repr__、__str____len__、__getitem__、__setitem__、__delitem__、__contains____iter__、__reversed__、__next____call____enter__、...
    99+
    2023-01-30
    方法 python
  • Python中关于集合的介绍与常规操作解析
    目录1.集合的介绍2.访问集合的元素3.集合的添加4.集合的修改5.集合的删除1.使用remove方法2.使用pop方法3.使用discard方法6.集合的交集和并集1.交集2.并集...
    99+
    2022-11-12
  • java中关于散列表的详细介绍
    什么是散列表散列表,也叫作哈希表(Hash Table),是一种提供键(Key)和值(Value)的映射关系的数据结构,只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1)。在线学习视频推荐:java视频散列表...
    99+
    2014-10-05
    java教程 java 散列表
  • C++中关于this指针的入门介绍
    目录简介特性举例注意简介 C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参 数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有...
    99+
    2022-11-13
  • 对于Python中RawString的理解介绍
    总结 1、'''作用: 可以表示 "多行注释" 、"多行字符串" 、"其内的单双引号不转义" 2、r 代表的意思是: raw 3、r 只对其内的反斜杠起作用(注意单个 的问题) raw string 有什...
    99+
    2022-06-04
    Python RawString
  • 关于网站设计中网页情景化设计的方法介绍(图)
      在信息化时代的现在,网络在人们生活已经产生了巨大的影响力,网络也在逐渐改变着人们的生活和习惯。然而,在如今信息大爆炸的今天,面对海量的网络信息,怎样才能实现既能吸引用户眼球,又能快速准确地传达信息呢这不仅需要内容本身...
    99+
    2022-06-12
    网页情景化 情景化设计
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作