首页
学习
活动
专区
圈层
工具
发布

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

引言 此前的文章中,我们介绍了 Python 面向对象编程及对象的继承和派生。 接下来的几篇文章,我们将详细介绍 Python 解释器提供的一系列特殊方法 -- 魔术方法。 2....魔术方法 在面向对象编程中,我们介绍了 __init__ 方法,这是由解释器默认实现,在构造对象是自动调用的特殊方法,类似的,Python 提供了一系列左右两边被一对双下划线包着的方法,这些方法被称为“...特殊方法是 Python 解释器自动调用的,因此你无需自己处理,但是,需要注意的是,这些特殊方法是如此强大,同时也存在着很多的陷阱,在使用中必须处处小心谨慎。 3. 自定义容器类 3.1....,只要在类外为不存在的属性赋值,改属性就会被创建,而 __getattr__ 只有在属性不存在的情况下才会被调用,此时,如果你需要定义独特的某个属性的行为,或彻底隐藏某个属性,就必须实现 __setattr...__setattr__ 方法会在每一次用户为某个属性赋值时被调用,因此要格外防范无限递归的产生: class TechlogTest: def __init__(self): self.values

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

    【python高级编程】namedtuple用法--给元组中的每个元素命名

    参考链接: Python中的命名元组Namedtuple 为什么要给元组中的每个元素命名  给每个元组中的元素命名,我们就可以使用名字去访问对应元素,相对于索引访问,这样可以大大提高程序的可读性。 ...使用元组赋值法  在c语言中,我们可以定义常量来命令,或者使用枚举变量来完成,而在python中,可以使用元组赋值法进行。...调用该函数后,它会返回一个tuple类型的子类(python的基本数据类型都是类),这个子类的中文名称为具名元组。 ...在使用普通的元组时,我们只能通过索引下标去访问对应元素,而namedtuple,我们既可以使用索引下标去访问,也可以通过名字去访问,增加了代码的可读性。 ..._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]     # 获取纸牌     def __getitem

    4.1K40

    Apple Swift编程语言入门教程

    与Python、JavaScript等有所区别。 如果初始化值没有提供足够的信息(或没有初始化值),可以在变量名后写类型,以冒号分隔。...if 语句中,条件必须是布尔表达式,这意味着 if score { ... } 是错误的,不能隐含的与0比较。...每个属性都需要赋值,无论在声明里还是在构造器里。 使用 deinit 来创建一个析构器,来执行对象销毁时的清理工作。 子类包括其超类的名字,以冒号分隔。在继承标准根类时无需声明,所以你可以忽略超类。...注意上面引用Hearts成员的两种方法:当赋值到 hearts 常量时,枚举成员 Suit.Hearts 通过全名引用,因为常量没有明确的类型。...你在创建实例时赋值。指定值和原始值的区别:枚举的原始值与其实例相同,你在定义枚举时提供原始值。 例如,假设情况需要从服务器获取太阳升起和降落时间。服务器可以响应相同的信息或一些错误信息。

    3K30

    Python 列表推导和生成器

    Python 会忽略代码里 []、{} 和 () 中的换行,因此如果你的代码里 有多行的列表、列表推导、生成器表达式、字典这一类的,可以省 略不太好看的续行符 \。...列表推导不会再有变量泄漏的问题,列表推导、生成器表达式,以及同它们很相似的集合(set)推导 和字典(dict)推导,在Python3 中都有了自己的局部作用域,就像函数似的。...表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。...= [str(index) for index in range(1,11)] + ['J', 'Q', 'K', 'A'] cards = [suit+rank for suit in suits...参考资料 流畅的Python(2017年人民邮电出版社出版)

    76920

    年薪20万Python工程师进阶(6):Python ORM框架之 Peewee入门Python中10个必读的PEP提案

    说到Python里面隐藏的彩蛋,PEP20算得上一个,在Python终端导入this模块,有二十条(其实是19条)关于Python编程的禅学,还不看过的可以在Python命令行输入 import this...地址:https://www.python.org/dev/peps/pep-0557/ 4、 PEP 435 枚举在Python2中被认为是一个没用的东西,打脸的是社区觉得枚举还是有存在的必要,于是...地址:https://www.python.org/dev/peps/pep-3156/ 6、 PEP 484 Python是一门动态语言,所谓动态类型语言是指我们在定义变量,返回返回值的时候无需指定类型...地址:https://www.python.org/dev/peps/pep-0484/ 7、PEP 572 PEP 572 是关于表达式赋值的提案,语法是这样的: while chunk := file.read...(8192): process(chunk) 该提案在社区争议性比较大,就是因为这个提案让 Python 之父愤然退出 Python 核心决策层,因为这个提案与社区其他成员产生了比较大的分歧。

    80630

    python 数据模型

    _cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] def __len__(self):...suit_values[card.suit] # 对卡牌进行升序排序 for card in sorted(deck, key=spades_high): print(card) ?..._neg__ -, __pos__ +,__abs__ abs() 这里有两类运算符要解释一下: 反向运算符:交换两个操作数的位置的时候会调用反向运算符,比如 b * a 而不是 a * b ; 增量赋值运算符...:把一种中缀运算符变成赋值运算的捷径,即是 a *= b 的操作 为什么 len 不是普通方法 len 之所以不是普通方法,是为了让 Python 自带的数据结构变得高效,前面也提到内置类型在使用 len...而在 python 的内置类型,比如列表 list、字符串 str、字典 dict 等查询数量是非常常见的操作。 这种处理方式实际上是在保持内置类型的效率和保证语言的一致性之间找到一个平衡点。

    1.5K20

    送书 | 跟我一起学《流畅的Python》

    有些Python开发者在提到__getitem__这个特殊方法的时候,会用诸如“下划线-下划线- getitem”2 这种说法,但是显然这种说法会引起歧义,因为像__x 这种命名在Python 里还有其他含义...增量赋值运算符则是一种把中缀运算符变成赋值运算的捷径(a = a * b 就变成了a *= b)。第13 章会对这两者作出详细解释。...在Python里对应的写法是s.count(x)。注意这里的s 是一个序列类型。...在第13章中,我们还会通过对Vector 类的扩展来学习如何实现这些运算符,当然还会提到如何让运算符满足交换律和增强赋值。...我在本书中一直都会用“数据模型”这个词,首先是因为在Python 文档里对这个词有偏爱,另外一个原因是Python 语言参考手册中与这里讨论的内容最相关的一章的标题就是“数据模型”(https://docs.python.org

    1.5K40

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

    但是,在match/case语句中,_是一个通配符,可以匹配任何值,但不会绑定到一个值。参见"使用序列进行模式匹配"。在 Python 控制台中,前一个命令的结果被赋值给_,除非结果是None。...在示例 2-7 中,我们在一条语句中将('Tokyo', 2003, 32_450, 0.66, 8014)赋值给city, year, pop, chg, area。...主题是 Python 将尝试与每个 case 子句中的模式匹配的数据。 ② 这个模式匹配任何包含三个元素的序列主题。第一个元素必须是字符串 'BEEPER'。...如果要将这些类型的对象视为序列主题,请在match子句中进行转换。...命名切片”,我从中学到了将切片赋值给变量以提高可读性的技巧,在我们的示例 2-13 中有所展示。

    1.8K00

    IOS-swift5.1快速入门之旅

    实验 用于\()在字符串中包含浮点计算,并在问候语中包含某人的姓名。 """对于占用多行的字符串,请使用三个双引号()。只要与匹配引号的缩进匹配,就会删除每个引用行开头的缩进。...语句中,条件必须是布尔表达式 - 这意味着代码如错误,而不是隐式比较为零。...else如果optionalName是,则添加一个设置不同问候语的子句nil。 如果是可选值nil,则条件为,false并且跳过括号中的代码。...添加一个参数,以包括今天在问候语中的特殊午餐。 默认情况下,函数使用其参数名称作为其参数的标签。在参数名称前写入自定义参数标签,或者写入_不使用参数标签。...请注意hearts上面引用枚举的两种方式:为hearts常量赋值时,枚举大小写Suit.hearts由其全名引用,因为常量没有指定显式类型。

    2.9K20

    针对Python基本数据类型的操作

    在第1行里,我们定义了一个整型变量age,赋值16,在第2行的print语句中,我们对age进行了加1操作,所以输出是17。...在第3行的returnVal变量之前,我们用0x前缀表示十六进制,通过第4行的打印语,我们能看到该变量的值是255。以上我们演示了针对整型变量的操作。...在第11行里,isExpensive变量的结果是布尔值True,因为price小于30,这个结果能从第12行的输出语句中看出。...布尔类型变量可以直接赋值成True或False,也可以用类似第11行的语句,通过表达式赋值。...上述代码里演示了针对基本数据类型的操作,这里请大家注意,由于Python里定义变量时无需指定数据类型,比如在第1行定义age时无需用int age=16的方式定义,所以在定义和使用时别混淆定义。

    74410

    python类型检测最终指南--Typing的使用

    在本指南中,你将了解Python类型检查。传统上,Python解释器以灵活但隐式的方式处理类型。Python的最新版本允许你指定可由不同工具使用的显式类型提示,以帮助您更有效地开发代码。...如果您只是想快速了解一下类型提示在Python中是如何工作的,并查看类型检查是否包括在您的代码中,那么您不需要阅读全部内容。...这些示例确认允许更改事物的类型,并且Python在更改时正确地推断出类型。 静态类型 与动态类型相反的是静态类型。在不运行程序的情况下执行静态类型检查。在大多数静态类型语言中,编译是在程序时完成的。...变量注释在PEP 526中定义,并在Python 3.6中引入。...虽然在python中没有赋值的变量直接输出是错误的。

    5.8K10

    基于ArrayList实现的简单的 <洗牌算法>

    前言: 相信大家都打过扑克牌吧,每当亲朋好友相聚一堂的时候,总少不了这一个娱乐环节,斗地主,跑得快等玩法层出不穷,同时在手机上也出现了不少的扑克牌娱乐的软件; 在我们准备打牌的时候,我们会先拿出一副牌,...card = new Card(); //实例化单张扑克牌对象 card.rank = j + 1; //对每张扑克牌的大小进行赋值...card.suit = SUIT[i]; //对每张扑克牌的花色进行赋值 deck.add(card);...card.suit = SUIT[i]; //对每张扑克牌的花色进行赋值 deck.add(card);...如果有什么疑问或者错误,欢迎大家在评论区指出,我会尽快回复,谢谢大家观看!!! 命运只负责洗牌,出牌的永远都是自己!!!

    71310

    利用维基百科促进自然语言处理

    SpikeX是一个spaCy管道的管道集合,spaCy管道是一个用于NLP的python库。SpikeX由一家意大利公司(Erre Quadro Srl)开发,旨在帮助构建知识提取工具。...在第二个例子中,对于“Elon Musk runs Tesla Motors”这句话,SpikeX提取了该句中可能在Wikipedia上有一个页面的所有页面。...最近,有人讨论“为了自动文本分析的目的,主题的定义在某种程度上取决于所采用的方法”[1]。潜Dirichlet分配(LDA)是一种流行的主题模型方法,它使用概率模型在文档集合中提取主题。...suit is disposed of....如我们所见,我们可以自动检测整个文档的主题(或类别)(在本例中是专利)。看看前5个类别,我们可以推断出这项专利是关于什么的。这是在没有任何训练的情况下完成的。

    2K30
    领券