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

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

引言 此前的文章中,我们介绍了 Python 面向对象编程及对象的继承派生。 接下来的几篇文章,我们将详细介绍 Python 解释器提供的一系列特殊方法 -- 魔术方法。 2....魔术方法”,让我们方便的实现 Python 的核心需要特性,让你的类使用更加方便: 迭代器 集合类 属性访问 运算符重载 函数方法调用 对象创建和销毁 字符串表示形式格式化 运行上下文管理 同时,实现这些魔术方法后...获取不存在的属性名 — __getattr__ __getattr__(self, name) 通过类实例点属性名可以实现类属性的访问,但有时我们需要定义当属性名不存在时的行为,这时就需要实现魔术方法:...设置属性 — __setattr__ __setattr__(self, key, value) 如果只实现 __getattr__,那你无法实现对属性的完全控制封装,因为 Python 独特的语言特性...,只要在类外为不存在的属性赋值,改属性就会被创建,而 __getattr__ 只有在属性不存在的情况下才会被调用,此时,如果你需要定义独特的某个属性的行为,或彻底隐藏某个属性,就必须实现 __setattr

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

Python中5对必知的魔法方法

迭代:__iter__ __next__ 用代码自动重复执行的某个作业,称为迭代,对此可以用for循环实现。我们将可以用于for循环的对象称为可迭代对象。...一般来说,迭代器是Python对象,可用于实现项的迭代。转换过程是通过实现 __iter__特殊方法来完成的。此外,检索迭代器的下一项涉及到__next__ 特殊方法的实现。...为了用一个自定义类实现这样的行为,需要实现__enter__ __exit__方法。...属性访问控制:__getattr__ __setattr__ 如果你有其他语言的编程经验,可能为实例属性设置过显式的getters(访问属性)setters(设置属性)。...在Python中,我们不需要对每个属性使用这些访问控制技术。但是,我们可以通过实现__getattr__ __setattr__方法来实现某种控制。

51720

python iter()与 __iter__()的区别

迭代器一定是可迭代对象:Iter()与 __iter__ 则用于产生 iterator(迭代器),__iter__ 迭代器协议,凡是实现__iter__协议的对象,皆是迭代器对象。...Iter()迭代器工厂函数,凡是有定义有__iter__()函数,或者支持序列访问协议,也就是定义有__getitem__()函数的对象 皆可以通过 iter()工厂函数 产生迭代器(iterable)...it_b,Iterator)print isinstance(a,Iterator)#运行结果1201TrueTrueTrue由上可以看出来 iter()与iter()均产生迭代器,Iter()与__iter...总体来说: __iter__用于自定义用户对象(类)   iter()用于支持序列访问协议,也就是定义有__getitem__()函数的内置对象,以及实现了__getitem__()函数的用户自定义对象...iter()也可以用于 实现了 __iter__()的对象,不过既然已经实现了__Iter__(),那么本身就是一个迭代器了,没必要在iter()一下。

1.5K20

魔法方法(2)

---- 注意 如果特性的行为怪异,务必确保你使用的是新式类(通过直接或间接地继承object或直接设置__metaclass__)。...---- __getattr__、__setattr__等方法 可以拦截对对象的所有访问企图,其用途之一是在旧式类中实现特性(在旧式类中,函数property的行为可能不符合预期)。...仅当没有找到指定的属性时,才会调用方法__getattr__。这意味着如果指定的名称不是size,这个方法将引发AttributeError异常。...---- 迭代器 之前粗略地提及了迭代器(可迭代对象),本节将更详细地介绍。对于魔法方法,这里只介绍__iter__,它就是迭代器协议的基础。...有些人可能之前只使用for循环迭代过序列字典,但实际上也可迭代其他对象:实现了方法__iter__的对象。

68430

Python入门之面向对象编程(三)Python类的魔术方法

python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法。..._del__ 对象在内存中被释放时触发(后面不设置例子) __len__ 定义 len(实例) 返回的内容,比如字符串类就定义的是字符串的字符个数,当然也可以改成其他的 __eq__ 改变==运算符的行为...__差不多,这些应用的典型类就是数值类,定义这些其实定义了某些运算符的行为,比如__iadd__定义了+=的行为一样。...) 实现 __iter__ __next__ 方法 如果只实现__iter__则这个方法的返回值必须是一个迭代器 也可以__iter__返回一个self,再定义__next__方法,接受self为参数,...在里面具体实现如何取得下一个值以及迭代器何时结束 原理是当对实例调用for循环时,相当于每次对__iter__的返回结果作用一次next()函数,所以要想迭代必须定义__iter__方法。

71240

Python魔术方法-Magic Method

我们来看一下: __getattr__(self, name): 定义当用户试图获取一个不存在的属性时的行为。...__getattribute__(self, name): __getattribute__定义了你的属性被访问时的行为,相比较,__getattr__只有该属性不存在时才会起作用。...因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免"无限递归"的错误。...可变容器协议则需要所有不可变容器的所有,另外还需要 __setitem__ __delitem__ 。如果你希望你的对象是可迭代的话,你需要定义 __iter__ 会返回一个迭代器。...迭代器必须遵循迭代器协议,需要有 __iter__(返回它本身) next。 __len__(self): 返回容器的长度。对于可变不可变容器的协议,这都是其中的一部分。

81760

Python 开发者不得不知的魔术方法(Magic Method)

我们来看一下: __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为。...__getattribute__(self, name) __getattribute__定义了你的属性被访问时的行为,相比较,__getattr__只有该属性不存在时才会起作用。...因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免”无限递归”的错误。...迭代器必须遵循迭代器协议,需要有 __iter__(返回它本身) next。 __len__(self) 返回容器的长度。对于可变不可变容器的协议,这都是其中的一部分。...迭代器是它们本身的对象,它们必须定义返回self的__iter__方法。 __reversed__(self) 实现当reversed()被调用时的行为。应该返回序列反转后的版本。

89770

Python面向对象编程-魔术方法-__call____getattr__方法

Python中的魔术方法__call____getattr__方法是用于实现对象可调用属性访问的重要方法。__call__方法__call__方法是用于定义对象可调用行为的魔术方法。...同时,getattr__方法也可以与其他属性访问方法(如__getattribute____setattr)结合使用,从而实现更加灵活的对象属性访问修改行为。...综上所述,__call____getattr__方法是Python中重要的魔术方法,用于实现对象的可调用行为属性访问行为。...在使用这两个方法时,我们应该注意方法的作用使用方式,并根据需要实现自定义的行为。...下面是一个综合示例,展示了如何使用__call____getattr__方法实现一个具有动态属性可调用行为的对象:class DynamicObject: def __init__(self)

72282

Python(六)

Python(六) 發佈於 2019-04-12 本篇,我们说说 Python 中的面向对象高级编程的基本概念。 数据封装、继承多态只是面向对象程序设计中最基础的 3 个概念。...举个例子,Python 自带了 TCPServer UDPServer 这两类网络服务,而要同时服务多个用户就必须使用多进程或多线程模型,这两种模型由 ForkingMixIn ThreadingMixIn...__ __next__ 果一个类想被用于 for … in 循环,类似 list 或 tuple,就必须实现一个 __iter__() 方法,该方法返回一个迭代对象,然后,Python 的 for...Python 有一个机制,那就是写一个 __getattr__() 方法,动态返回一个属性: class Person: def __init__(self): self.name...,比如 score,Python 解释器会试图调用 __getattr__(self, ‘score’) 来尝试获得属性,这样,我们就有机会返回 score 的值。

46910

Python学习笔记整理(十五)类的编写

如今,Python中所有的迭代环境都会先尝试__iter__方法,再尝试__getitem__。如果对象不支持迭代协议,就会尝试索引运算。...以Python raise语句发出信号表示迭代结束。__iter__对象会在调用过程中明确地保留状态信息。所以比__getitem__具体更好的通用性。...__iter__迭代器比__getitem__更复杂难用。迭代器是用来迭代,不是随机的索引运算。...__getitem__不同的是,__iter__只循环一次,而不是循环多次,循环之后就变为空,每次新的循环,都得创建一个新的。...__getattr____setattr__捕捉属性的引用。 __getattr__方法是拦截属性点号运算。__getattr__可以作为钩子来通过通用的方式相应属性请求。

86710

Python学习 Day 10 str iter getitem getattr call

def __str__(self): return 'Student object (name=%s)' % self.name __repr__ = __str__ __iter...__ 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next...class Fib(object): def __init__(self): self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter...总之,通过上面的方法,我们自己定义的类表现得Python自带的list、tuple、dict没什么区别,这完全归功于动态语言的“鸭子类型”,不需要强制继承某个接口。..._(self, attr): if attr=='score': return 99 当调用不存在的属性时,比如score,Python解释器会试图调用__getattr

86330

Python语言学习基础:魔术方法的定义、迭代器与生成器、常用魔术方法及其分类型介绍

,通过介绍学习这些基础知识,让大家能够更好地理解使用Python语言,分享给有需要的小伙伴。...通过定义实现这些魔术方法,我们可以自定义对象的行为特性。...,我们将能够更好地定制控制Python对象的行为,从而提高代码的灵活性可读性。...结束语 通过本文对Python语言中的魔术方法的定义、迭代器与生成器的概念、常用的魔术方法以及按类型分类的详细介绍,魔术方法可以让我们在对象的创建、操作和销毁等过程中实现自定义的行为特性,通过理解掌握这些基础知识...希望本文对大家学习Python语言的基础知识魔术方法有所帮助,通过学习实践,你将能够更加灵活高效地使用Python语言。

47644

Python面向对象编程-魔术方法-__iter____next__方法(二)

除了实现自定义迭代器对象,我们还可以使用Python内置的可迭代对象迭代器对象。Python中常见的可迭代对象包括列表、元组、字符串、字典、集合等。...这些对象都实现了__iter__方法,并返回一个迭代器对象。使用for循环遍历这些对象时,Python会自动获取其迭代器对象,并调用其__next__方法获取每个元素,直到所有元素都被遍历完毕。...下面是一个使用内置可迭代对象迭代器对象的例子,展示了如何遍历一个字符串一个列表:s = "hello"it1 = iter(s)# 使用while循环遍历迭代器中的所有元素while True:...总之,__iter____next__方法是Python中用于定义迭代器对象的魔术方法,它们在for循环中起到重要作用。...我们可以通过实现自定义迭代器对象,或者使用Python内置的可迭代对象迭代器对象来实现迭代操作。

43281

Python 3 之 运算符重载详解

以下是对重载的关键概念的复习: 运算符重载让类拦截常规的Python运算。 类可重载所有Python表达式运算符 类可以重载打印、函数调用、属性点号运算等内置运算 重载使类实例的行为像内置类型。...---- 属性引用:__getattr____setattr__ __getattr__方法是拦截属性点号运算。...当我们在后面文章看到实际的委托内容属性时,你会再看到__getattr__。 有个相关的重载方法__setattr__会拦截所有属性的赋值语句。...为使其更有效,必须增强它的功能,让子类也能够设置私有属性,并且使用__getattr__包装(有时称为代理)来检车对私有属性的读取。...这样行得通,可用于完成一些清理行为(例如,中断服务器的连接)。然而,基于某些原因,在Python中,析构函数不像其他OOP语言那么常用。

3.8K10
领券