iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python基础-特殊方法整理详解
  • 468
分享到

Python基础-特殊方法整理详解

2024-04-02 19:04:59 468人浏览 泡泡鱼

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

摘要

目录1、概述2、常用特殊方法及实现2.1 _len__()2.2 __str__()2.3 __iter__()2.4 __getitem__()2.5 __new__()2.6 使

1、概述

python中特殊方法(魔术方法)是被Python解释器调用的,我们自己不需要调用它们,我们统一使用内置函数来使用。例如:特殊方法__len__()实现后,我们只需使用len()方法即可;也有一些特殊方法的调用是隐式的,例如:for i in x: 背后其实用的是内置函数iter(x)。

下面将介绍一些常用特殊方法和实现。通过实现一个类来说明

2、常用特殊方法及实现

2.1 _len__()

一般返回数量,使用len()方法调用。在__len__()内部也可使用len()函数


class Zarten():
    def __init__(self, age):
        self.age = age
        self.brother = ['zarten_1', 'zarten_2']

    def __len__(self):
        return len(self.brother) #可直接使用len()
        # return self.age

z = Zarten(18)
print(len(z))

2.2 __str__()

对象的字符串表现形式,与__repr__()基本一样,微小差别在于:

  • __str__()用于给终端用户看的,而__repr__()用于给开发者看的,用于调试和记录日志等。
  • 在命令行下,实现__str_()后,直接输入对象名称会显示对象内存地址;而实现__repr__()后,跟print(对象)效果一样。
  • 若这2个都实现,会调用__str_(),一般在类中至少实现__repr__()


class Zarten():
    def __repr__(self):
        return 'my name is Zarten_1'

    def __str__(self):
        return 'my name is Zarten_2'

z = Zarten()
print(z)

2.3 __iter__()

返回一个可迭代对象,一般跟__next__()一起使用

判断一个对象是否是:可迭代对象 from collections import Iterable


from collections import Iterable

class Zarten():
    def __init__(self, brother_num):
        self.brother_num = brother_num
        self.count = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.count >= self.brother_num:
            raise StopIteration
        else:
            self.count += 1
            return 'zarten_' + str(self.count)


zarten = Zarten(5)
print('is iterable:', isinstance(zarten, Iterable)) #判断是否为可迭代对象
for i in zarten:
    print(i)

2.4 __getitem__()

此特殊方法返回数据,也可以替代__iter_()__next__()方法,也可支持切片


class Zarten():
    def __init__(self):
        self.brother = ['zarten_1','zarten_2','zarten_3','zarten_4','zarten_5',]

    def __getitem__(self, item):
        return self.brother[item]

zarten = Zarten()
print(zarten[2])
print(zarten[1:3])

for i in zarten:
    print(i)

2.5 __new__()

__new__()用来构造一个类的实例,第一个参数是cls,一般情况下不会使用。而__init__()用来初始化实例,所以__new__()__init___()先执行。

__new__()不返回,则不会有任何对象创建,__init___()也不会执行;

__new__()返回别的类的实例,则__init___()也不会执行;

用途:可使用__new___()实现单例模式


class Zarten():
    def __new__(cls, *args, **kwargs):
        print('__new__')
        return super().__new__(cls)

    def __init__(self, name, age):
        print('__init__')
        self.name = name
        self.age = age

    def __repr__(self):
        return 'name: %s  age:%d' % (self.name,self.age)

zarten = Zarten('zarten', 18)
print(zarten)

2.6 使用__new__()实现单例模式


class Zarten():
    _singleton = None

    def __new__(cls, *args, **kwargs):
        print('__new__')
        if not cls._singleton:
            cls._singleton = super().__new__(cls)
        return cls._singleton

    def __init__(self, name, age):
        print('__init__')
        self.name = name
        self.age = age

    def __repr__(self):
        return 'name: %s  age:%d' % (self.name,self.age)

zarten = Zarten('zarten', 18)
zarten_1 = Zarten('zarten_1', 19)
print(zarten)
print(zarten_1)
print(zarten_1 == zarten)



2.7 __call__()

实现后对象可变成可调用对象,此对象可以像函数一样调用,例如:自定义函数,内置函数,类都是可调用对象,可用callable()判断是否是可调用对象


class Zarten():

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __call__(self):
        print('name:%s  age:%d' % (self.name, self.age))


z = Zarten('zarten', 18)
print(callable(z))
z()

2.8__enter__()

一个上下文管理器的类,必须要实现这2个特殊方法:__enter_()__exit__() 使用with语句来调用。

使用__enter__()返回对象,使用__exit__()关闭对象


class Zarten():

    def __init__(self, file_name, method):
        self.file_obj = open(file_name, method)

    def __enter__(self):
        return self.file_obj

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file_obj.close()
        print('closed')


with Zarten('e:\\test.txt', 'r') as f:
    r = f.read()
    print(r)

2.9 __add__()

加法运算符重载以及__radd__()反向运算符重载

当对象作加法时,首先会在“+”左边对象查找__add__(),若没找到则在“+”右边查找__radd__()


class Zarten():

    def __init__(self, age):
        self.age = age

    def __add__(self, other):
        return self.age + other

    def __radd__(self, other):
        return  self.age + other



z = Zarten(18)
print(z + 10)
print(20 + z)

2.10 __del__()

对象生命周期结束时调用,相当于析构函数


class Zarten():

    def __init__(self, age):
        self.age = age

    def __del__(self):
        print('__del__')


z = Zarten(18)

特殊(魔术)方法汇总一览表

到此这篇关于Python基础-特殊方法详解的文章就介绍到这了,更多相关Python基础-特殊方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python基础-特殊方法整理详解

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

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

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

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

下载Word文档
猜你喜欢
  • Python基础-特殊方法整理详解
    目录1、概述2、常用特殊方法及实现2.1 _len__()2.2 __str__()2.3 __iter__()2.4 __getitem__()2.5 __new__()2.6 使...
    99+
    2022-11-12
  • Python特殊方法整理汇总
    运算符无关特殊方法 运算符相关特殊方法 到此这篇关于Python特殊方法整理汇总的文章就介绍到这了,更多相关Python特殊方法内容请搜索编程网以前的文章或继续浏览下面的相关文章...
    99+
    2022-11-11
  • python 特殊属性及方法详细解析
    目录概述特殊属性1、 _ _ name _ _2、_ _ bases _ _ 和_ _ base _ _ 以及 _ _ mro _ _3、_ _ class _ _4、_ _ dic...
    99+
    2022-11-12
  • SpringBootYAML语法基础详细整理
    目录YAMLYAML 简介YAML 语法YAML 常用写法YAML Spring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spri...
    99+
    2022-11-13
    SpringBoot YAML语法 Java YAML
  • 详解Python中的__new__、__init__、__call__三个特殊方法
    __new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个参数是self。 ...
    99+
    2022-06-04
    详解 方法 Python
  • PHP获取特殊时间戳的方法整理
    目录问题描述解决方案今天时间戳与日期时间戳日期格式昨天时间戳与日期日期格式本周时间戳与日期时间戳日期格式本月时间戳和日期时间戳日期格式本季度时间戳和日期时间戳日期格式当前年时间戳和日...
    99+
    2023-01-10
    PHP获取特殊时间戳 PHP 特殊时间戳 PHP 时间戳
  • Python基础之常用库常用方法整理
    目录一、os二、configparser三、openpyxl四、loguru五、time六、unittest一、os __file__ 获取当前运行的.py文件所在的...
    99+
    2022-11-12
  • Python selenium基础用法详解
    ​  活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 学习日记 目录 学习日记 一、Selenium库介绍 1、Selenium简介 2、Selenium的安装 3...
    99+
    2023-09-08
    python selenium
  • java基础之方法详解
    目录一、什么是方法二、方法的定义三、方法的调用四、方法的重载五、递归一、什么是方法 Java方法是语句的集合,他们在一起执行一个功能。 1.方法是解决一类问题的步骤的有序...
    99+
    2022-11-12
  • python机器学习基础特征工程算法详解
    目录一、机器学习概述二、数据集的构成1.数据集存储2.可用的数据集3.常用数据集的结构三、特征工程1.字典数据特征抽取2.文本特征抽取3.文本特征抽取:tf-idf4.特征预处理:归...
    99+
    2022-11-12
  • Python语法概念基础详解
    目录Python之禅:Python基础:1.进制转换:2.数据类型:3.单双引号转义字符的使用:4.单双三引号的转义换行:5.字符串的运算:6.组的概念与含义:7.集合:8.系统关键...
    99+
    2022-11-12
  • 实例解析Python中的__new__特殊方法
    __new__ 方法是什么? 如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句负责...
    99+
    2022-06-04
    实例 方法 Python
  • Reactrouter基础使用方法详解
    目录react-routerbrowserHistoryReachRouterreact-router 1、使用方法 <Router history={hashHistory}...
    99+
    2023-05-17
    React router React router使用方法
  • GoLangbytes.Buffer基础使用方法详解
    目录一、bytes.Buffer的基础知识二、bytes.Buffer类型的值已读计数的作用三、bytes.Buffer的扩容策略四、bytes.Buffer的哪些方法会造成内容的泄...
    99+
    2023-03-19
    GoLang bytes.Buffer Go bytes.Buffer
  • Python进阶学习之特殊方法实例详析
    前言 最近在学习python,学习到了一个之前没接触过的--特殊方法。 什么是特殊方法?当我们在设计一个类的时候,python中有一个用于初始化的方法$__init__$,类似于java中的构造器,这个就是...
    99+
    2022-06-04
    进阶 实例 方法
  • python链表的基础概念和基础用法详解
    本文为大家分享了python链表的基础概念和基础用法,供大家参考,具体内容如下 一、什么是链表 链表是由多个不同的节点组成,每个节点通过指针区域关联到一起链表的头指针,指向了头节点,...
    99+
    2022-11-10
  • Python基础之Numpy的基本用法详解
    一、数据生成 1.1 手写数组 a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) # 一维数组 b = np.array([[1, 2], [3, 4]]) #二维...
    99+
    2022-06-02
    Python Numpy用法 Python Numpy
  • winxp技巧使用方法及特殊之处详解
    1.在记事本中自动记录文件的打开时间 在记事本中,我们可以记录每次打开某个文本文件的时间,方法为:在该文件的第一行输入“.LOG”(注意:必须大写!),然后换行开始正文。这样在每次打开了该文件之后...
    99+
    2023-05-26
    winxp技巧 windowsxp使用技巧 使用 winxp 技巧 方法
  • Python基础语法之容器详解
    目录Python基础语法-容器1.列表(list)1.1 列表基本概念1.2 获取元素1.3 增、删、改1.3.1 增 - —增加元素1.3.2 删 — 删除元素1.3.3 改—改变...
    99+
    2022-11-12
  • Python入门之基础语法详解
    目录一、我的经历及目标二、Python简介三、Python基础语法3.1行和缩进3.2Python注释3.3Python空行3.4同一行显示多条语句3.5print输出3.6多个语句...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作