首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python教程(23)——Python类中常用的特殊成员

这些特殊成员在类的定义中具有特殊的语法和功能,用于实现对象的特定行为和操作。 特殊方法一般由Python解释器调用,无需手动调用。...通过在类中定义这些特殊方法,可以改变对象的默认行为,使其具备更多的功能和操作。特殊方法提供了一种更加Pythonic的面向对象编程的方式,可以让代码更加简洁和易读。...__getitem__ 方法通常与 __setitem__ 方法一起使用,以支持对象的索引和切片操作。通过定义这些方法,我们可以使自定义的类对象能够像内置的容器类型一样进行元素的访问和修改。...如果一个类没有定义 __getitem__ 和 __setitem__方法,或者__getitem__ 和 __setitem__方法不能处理给定的索引值或切片对象,那么当我们尝试通过索引或切片来访问(...在该方法中,我们将传入的两个参数进行相加,Python 解释器会自动调用对象 add 的 __call__ 方法,并将传递给该方法。

14110

Python进阶:全面解读高级特性之切片!

在使用切片的过程中,有什么要点值得重视,又有什么底层原理值得关注呢?本文将主要跟大家一起来探讨这些内容,希望我能与你共同学习进步。...切片是 Python 中最迷人最强大最 Amazing 的语言特性(几乎没有之一),以上两小节虽然介绍了切片的基础用法与高级用法,但这些还不足以充分地展露切片的魅力,所以,在接下来的两章节中,我们将聚焦于它的更高级用法...3.1、魔术方法:`getitem()` 想要使自定义对象支持切片语法并不难,只需要在定义类的时候给它实现魔术方法 __getitem__() 即可。所以,这里就先介绍一下这个方法。...4、迭代器实现切片功能 好了,介绍完一般的自定义对象如何实现切片功能,这里将迎来另一类非同一般的对象。...4.2、迭代器切片 前面提到了“一同两不同”,最后的不同是,普通可迭代对象在转化成迭代器的过程中会丢失一些属性,其中关键的属性是 __getitem__ 。

93840
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python 数据模型

    这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。假如我们在讨论,拥有哪些方法和属性的对象可以称为序列,实际上我们就是在讨论序列的数据模型。...不管在哪种框架下写程序,都会花费大量的时间区实现那些会被框架本身调用的方法,Python 框架本身也不例外。当你在使用 object[item] 的时候,背后实际上是调用了object....,支持切片,也支持len 方法,这其实就是实现了 Python 序列的协议(非正式接口),我们通过数据模型实现了自定义的序列,而非子类化内置序列,这其实也是鸭子模型的一种语言,当某个类的行为看起来像鸭子...上面的实例中,MyList 类可以进行迭代和切片,切片的功能是由 __getitem__ 提供的,迭代的功能实际上是由 __iter__ 提供的,它返回一个可迭代对象。...这种处理方式在保持内置类型的效率和保证语言的一致性之间找到了一个平衡点,也印证了“ Python 之 ”中的另外一句话:“不能让特例特殊到开始破坏既定规则。”

    90520

    Python进阶:迭代器与迭代器切片

    如上图蓝圈所示,普通可迭代对象与迭代器的最关键区别可概括为:一同两不同 ,所谓“一同”,即两者都是可迭代的(__iter__),所谓“两不同”,即可迭代对象在转化为迭代器后,它会丢失一些属性(__getitem...2、迭代器切片 前面提到了“一同两不同”,最后的不同是,普通可迭代对象在转化成迭代器的过程中会丢失一些属性,其中关键的属性是 __getitem__ 。...在《Python进阶:自定义对象实现切片功能》中,我曾介绍了这个魔术方法,并用它实现了自定义对象的切片特性。 那么问题来了:为啥迭代器不继承这个属性呢?...islice() 方法将迭代器与切片完美结合,终于回答了前面的问题。...:即允许你对一个无穷的(在系统支持范围内)迭代器进行切片的能力。

    1.6K41

    Python学习——数据模型特殊方法

    数据模型其实是对Python框架的描述,它规范了这门语言自身构架模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。...简单来说,数据模型就是Python自身的数据类型,及其包含的特殊方法。这些特殊方法在Java中也被成为‘魔术方法’。...唯一的例外可能是__init__方法,你的代码里可能经常会用到它,目的是在你的子类的__init__方法中调用超类的构造器。...2.通过内置的函数(例如len、iter、str等)来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,通常还提供额外的好处,而且对于内置的类来说,它们的速度更快。...__方法,解释器会将0传递给__getitem__(self, item)中的item参数 print(deck[1:4]) #使用切片操作时也会调用__getitem__方法,解释器会传递slice

    50110

    八、python学习笔记-面向对象-练习

    ,将self.name 赋值为空(赋值为空也是有返回的),当然也可以删除(del self.name),只是删除后,程序获取不到返回值会报错,因为删除的是变量而不是变量的值。...(1, 100000): li.append(i) """定义类以及方法 1、构造方法,传递用户输入的页码,传递给实例变量self.page 2、计算起始内容,通过类的属性方式返回起始值,可以在后面调用时使用类似变量的调用方式...(调用时不用使用括号) 3、计算结尾内容,通过类的属性方式返回结尾值,可以在后面调用时使用类似变量的调用方式(调用时不用使用括号) 注:每页显示10个内容,注意列表取值包括左边不包括右边,li列表第一个值为...) print(li[page.start:page.end]) 使用特殊的类成员实现切片 # 模拟列表切片 """ 1、slice类,python中的一种类,格式[i:j:k],i是起始值,...3、如果是切片操作必是slice类,通过传入参数的类型判定是否为切片 """ class Foo: def __getitem__(self, item): if type(item

    32631

    Python进阶:自定义对象实现切片功能

    切片是 Python 中最迷人最强大最 Amazing 的语言特性(几乎没有之一),在《Python进阶:切片的误区与高级用法》中,我介绍了切片的基础用法、高级用法以及一些使用误区。...1、魔术方法:__getitem__() 想要使自定义对象支持切片语法并不难,只需要在定义类的时候给它实现魔术方法 __getitem__() 即可。所以,这里就先介绍一下这个方法。...特别需要说明的是,此例中的 __getitem__() 方法会根据不同的参数类型而实现不同的功能(取索引位值或切片值),也会妥当地处理异常,所以并不需要我们再去写繁琐的处理逻辑。...网上有不少学习资料完全是在误人子弟,它们会教你区分参数的不同类型,然后写一大段代码来实现索引查找和切片语法,简直是画蛇添足。...TypeError 上例的关键点在于将字典的键值取出,并对键值的列表做切片处理,其妙处在于,不用担心索引越界和负数索引,将字典切片转换成了字典键值的切片,最终实现目的。

    99850

    python 魔术方法(一) 自定义容器类与类属性控制

    引言 此前的文章中,我们介绍了 Python 面向对象编程及对象的继承和派生。 接下来的几篇文章,我们将详细介绍 Python 解释器提供的一系列特殊方法 -- 魔术方法。 2....,大量 Python 标准库中的方法将可以直接用于你的类。...特殊方法是 Python 解释器自动调用的,因此你无需自己处理,但是,需要注意的是,这些特殊方法是如此强大,同时也存在着很多的陷阱,在使用中必须处处小心谨慎。 3. 自定义容器类 3.1....索引与切片 我们建立了一个纸牌类,有了 __getitem__ 方法,我们就定义了索引操作,所有 dict 通过 [] 可以做的事,我们的纸牌类都可以做到: >>> deck = FrenchDeck(...但是,需要注意的是,如果你自己实现了 __getitem__ 方法,并且没有调用父类的 __getitem__ 方法,那 __missing__ 将永远都不会被调用。

    62720

    pandas作者当年遇到了什么麻烦,才设计出如此糟糕的警告机制

    有一些无脑的教程会说,你得用 copy: 无缘无故为啥要复制一整份数据。难道每次赋值都要 copy ? 我在 pandas 专栏中也详细讲解了其中的原理,主要是驳斥了网络上一些无脑说法。...今天我们换一个角度,尝试成为 pandas 作者,看看当时作者到底遇到了什么样的难题,使得他做出这样子设计。 为什么我不把文章发布在 pandas 专栏中?...因为我们不希望后续操作会影响原来的数据 现在可以条件筛选: 现在的问题是,筛选总是用 where 显得太啰嗦。在 python 中对集合的物件取出元素,是有专门的语法 [...] 。...行2:语法 对象[切片范围] 这不也是一种数据筛选的方式吗?我们自定义的类也能有这样子的语法支持吗? ---- 魔法方法 从对象的角度来说,它只不过是数据与函数的结合体。...这就是为什么在我的 pandas 专栏中明确告诉大家,只要你明确知道需要修改的数据表对象,那就可以不用管这警告 你觉得这种设计思路是不是挺巧妙,同时又让人有点无语?

    33720

    python 数据模型

    块) 一摞 Python 风格的纸牌 接下来尝试自定义一个类,并实现两个特殊方法:__getitem__ 和 __len__ ,看看实现它们后,可以对自定义的类示例实现哪些操作。...由于我们实现 __getitem__ 方法是获取纸牌,所以也可以支持切片(slicing)的操作,例子如下所示: # 切片 print(deck[:3]) print(deck[12::13]) ?...把一种中缀运算符变成赋值运算的捷径,即是 a *= b 的操作 为什么 len 不是普通方法 len 之所以不是普通方法,是为了让 Python 自带的数据结构变得高效,前面也提到内置类型在使用 len...而在 python 的内置类型,比如列表 list、字符串 str、字典 dict 等查询数量是非常常见的操作。 这种处理方式实际上是在保持内置类型的效率和保证语言的一致性之间找到一个平衡点。...小结 本文介绍了两个代码例子,说明了在自定义类的时候,实现特殊方法,可以实现和内置类型(比如列表、字典、字符串等)一样的操作,包括实现迭代、运算符重载、打印类实例对象等,然后还根据是否和运算符相关将特殊方法分为两类

    99320

    流畅的 Python 第二版(GPT 重译)(六)

    示例 11-3 展示了它的用法:定义一个在类上而不是在实例上操作的方法。classmethod改变了方法的调用方式,因此它接收类本身作为第一个参数,而不是一个实例。...现在应该清楚为什么Vector2d的bytes导出以typecode为前缀:我们想要支持不同的导出格式。 如果要更改类属性,必须直接在类上设置,而不是通过实例。...要使Vector生成Vector实例作为切片,我们不能简单地将切片委托给array。我们需要分析在__getitem__中获得的参数并做正确的事情。...⑥ 默认情况:调用超类上的 __setattr__ 以获得标准行为。 提示 super() 函数提供了一种动态访问超类方法的方式,在像 Python 这样支持多重继承的动态语言中是必不可少的。...在第十六章中,我们将在Vector上实现几个中缀运算符。数学将比这里的angle()方法简单得多,但探索 Python 中中缀运算符的工作方式是面向对象设计的一课。

    14910

    Day11面向对象高级编程23

    MixIn 在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。...,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。...__()传入的参数可能是一个int,也可能是一个切片对象slice,如果要切片需要做判断: class Fib(object): def __getitem__(self,n):...path就是''+'/'+'a'='/a' 第三次把a对象当做函数调用,参数是'mike',显然函数不存在,调用__call__方法,参数传进去,并且将新对象返回,这个时候返回的还是一个Chain的对象...b 属性,执行getattr函数,将/a/b传入, 然后.user(“Michael”),先会执行getattr返回Chain实例,但是因为有()括号在,所以返回的是Chain(), 这个就会调用call

    68570

    Python如何设计面向对象的类(下)

    本文将在上篇文章二维向量Vector2d类的基础上,定义表示多维向量的Vector类。...超过6个的元素用...来表示。 第2版:支持切片 Python协议是非正式的接口,只在文档中定义,在代码中不定义。...比如Python的序列协议只需要__len__和__getitem__两个方法,Python的迭代协议只需要__getitem__一个方法,它们不是正式的接口,只是Python程序员默认的约定。...小结 经过上下两篇文章的介绍,我们知道了Python风格的类是什么样子的,跟常规的面向对象设计不同的是,Python的类通过魔法方法实现了Python协议,使Python类在使用时能够享受到语法糖,不用通过...参考资料: 《流畅的Python》第10章 序列的修改、散列和切片

    54930

    Python 5.4 定制类

    定制类 看到类似的__slots__这种形如__xx__的变量或者函数名就要注意,这些在Python中有特殊用途。 Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。...原因是__getitem__()传入的参数可能是一个int,亦可能是一个切片对象slice,所以要做判断: class Fib(object):     def __getitem__(self,n):...总之,通过上面的方法,我们自定义的类和Python自带的list、tuple、dict没什么区别。这完全归功于动态语言的“鸭子类型”,不需要强制继承某个接口。...__call__ 一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能在实例本身上调用方法呢?在Python中答案是肯定的。...小结: Python的class允许定义许多定制方法,可以让我们非常方便的生成特制类。

    68510

    python 面向对象技巧 定制类

    看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。...除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。...原因是__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断: class Fib(object): def __getitem__(self, n)...if attr=='age': return lambda: 25 只是调用方式要变为: >>> s.age() 25 注意,只有在没有找到属性的情况下,才调用__getattr...小结 Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类。 本节介绍的是最常用的几个定制方法,还有很多可定制的方法,请参考Python的官方文档。

    43520

    Python 【面向对象】

    前言 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。...Python的类可以继承多个类,Java和C#中则只能继承一个类 Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先 当类是经典类时多继承情况下,会按照深度优先方式查找...特性: 静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性 静态方法使用场景: 我们要写一个只在类中运行而不在实例中运行的方法....python2.7中还存在,用来对对象进行切片的,但是在python3之后,将这些特殊方法给去掉了,统一使用上面的方式对对象进行切片,因此在使用__getitem__ __setitem__ 这两个方法之前要先判断传递进参数的类型是不是...,所以self.name = name 等价于 d.name = name 在调用类方法d.sayhi()的时候相当于调用d.sayhi(d),上一步实例化时已经将d.name = name(赋值给了

    1.6K30

    Python中的魔法属性

    魔法属性 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method,例如类的初始化方法 __init__() ,实例对象创造方法 __new__()等。...魔法属性和方法是Python内置的一些属性和方法,有着特殊的含义。命名时前后加上两个下划线,在执行系统特定操作时,会自动调用。...__new__ 是用来创建类并返回这个类的实例,而 __init__ 只是将传入的参数来初始化该实例。...注:此方法一般无须定义,因为Python是一门高级语言,有 内存管理、垃圾回收机制,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__ 的调用是由解释器在进行垃圾回收时自动触发执行的...它们反应了关于面向对象程序上一些重要的东西在Python 上,并且总的来说 Python 总是一个简单的方法去找某些事情,即使是没有必要的。

    1.1K01

    Python中的魔法属性

    魔法属性 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method,例如类的初始化方法 __init__() ,实例对象创造方法 __new__()等。...魔法属性和方法是Python内置的一些属性和方法,有着特殊的含义。命名时前后加上两个下划线,在执行系统特定操作时,会自动调用。...__new__ 是用来创建类并返回这个类的实例,而 __init__ 只是将传入的参数来初始化该实例。...注:此方法一般无须定义,因为Python是一门高级语言,有 内存管理、垃圾回收机制,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__ 的调用是由解释器在进行垃圾回收时自动触发执行的...它们反应了关于面向对象程序上一些重要的东西在Python 上,并且总的来说 Python 总是一个简单的方法去找某些事情,即使是没有必要的。

    50220

    Python中的魔法属性

    魔法属性 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method,例如类的初始化方法 __init__() ,实例对象创造方法 __new__()等。...魔法属性和方法是Python内置的一些属性和方法,有着特殊的含义。命名时前后加上两个下划线,在执行系统特定操作时,会自动调用。...__new__ 是用来创建类并返回这个类的实例,而 __init__ 只是将传入的参数来初始化该实例。...注:此方法一般无须定义,因为Python是一门高级语言,有 内存管理、垃圾回收机制,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__ 的调用是由解释器在进行垃圾回收时自动触发执行的...它们反应了关于面向对象程序上一些重要的东西在Python 上,并且总的来说 Python 总是一个简单的方法去找某些事情,即使是没有必要的。

    48020
    领券