Python基础教程(第3版)中文版 第9章 魔法方法、特性和迭代器(笔记)

简介: Python基础教程(第3版)中文版 第9章 魔法方法、特性和迭代器(笔记)

                            第9章 魔法方法、特性和迭代器

1. 如果使用的不是python3

使用py -3 无需显式继承object

2. 构造函数(constructor)

创建构造函数:将方法名称改成__init__

对象创建时自动调用。

1.重写普通方法,子类将覆盖父类(或称超类)方法

重写构造函数时,要调用父类的构造函数来帮助初始化对象。

2.调用未关联的父类构造函数#如果使用的新类,可跳过这里,看3.使用函数super

通过类调用方法,没有实例与其关联。


举例:已有Bird类。

SongBird继承Bird

class SongBird(Bird):

   def __init__(self):

       Bird.__init__(self)

       self.sound = 'Squawk!'

   #...

Bird.__init__(self) 是通过类Bird调用方法

而没有和实例相关联。

3.使用函数super

只适用于新式类。

将当前类和当前实例作为参数,对其返回的对象调用方法时,调用的将是父类的方法。

举例:

上面的SongBird 的构造函数可以写出

super(SongBird, self).__init__()

py -3中可以不提供参数。于是可写成:

super().__init__()

#使用函数super比 未关联构造函数更好

3. 元素访问

1.基本的序列和映射协议

序列和映射 是元素(item)的集合.实现它们的基本行为,不可变对象要2个方法,可变对象要4个。

__len__(self):返回项数

__getitem__(self,key): 返回和键相关联的值

__setitem__(self,key,value):设置值,只有可变对象需要

__delitem__(self, key):删除,在对象的组成部分使用__del__时调用,只有可变对象需要


2.从list、dict和str派生

4.其他魔法方法

5.特性(property)

通过存取方法定义的属性通常称为特性。

举例: 有1个Recttangle类

class Rectangle:

   def __init__(self):

       self.width = 0

       self.height = 0

   def set_size(self, size):

       self.width, self.height = size

   def get_size(self):

       return self.width, self.height


   它有属性宽(width)和高(height)

   而 set_size 和get_size 是假想属性 size 的存取方法,size属性是有width和 height 组成的元组.

   python可隐藏存取方法,让这个属性看起来是常规的属性。

   通过存取方法定义的属性叫特性(property)

1.函数property

例:在上面Rectangle类下面加上一行:

size = property(get_size,set_size)


这样就能像对待width、height一样对size了。

r = Rectangle()

r.size


property参数

fget,fset,fdel,doc



2.静态方法和类方法(很少用到它们)

静态方法的定义没有参数self,可以通过类调用

类方法的定义中包含类似self的参数,通常是cls,类方法可以通过对象调用,但参数cls将关联到类

class MyClass:


   def smeth():

       print("This is a static method")

   smeth = staticmethod(smeth)


   def cmeth(cls):

       print("This is a class method of", cls)

   cmeth = classmethod(cmeth)


   装饰器:用于包装方法、对象

   class MyClass:


   @staticmethod

   def smeth():

       print("This is a static method")

 

   @classmethod

   def cmeth(cls):

       print("This is a class method of", cls)

 


3.__getattr__、__setattr__等方法

拦截对 对象属性的访问。

用途之一是实现特性。


__getattribute__(self, name):在属性被访问时自动调用

__getattr__(self, name):访问对象没有的属性时调用

__setattr__(self, name, value):给属性赋值时调用

__delattr__(self, name): 删除属性


例子:

class Rectangle:

   def __init__(self):

       self.width = 0

       self.height = 0

   def __setattr__(self,name,value):

       if name == 'size':

           self.width, self.height = value

       else:

           self.__dict__[name] = value

   def __getattr__(self,name):

       if name == 'size':

           return self.width,self.height

       else:

           raise AttributeError()

6.迭代器

1.迭代器协议

迭代(iterate)意味重复多次,就像循环

对实现了方法__iter__的对象可以进行迭代。

__iter__ 返回一个迭代器,它是包含 __next__的对象

调用__next__时,迭代器应返回下一个值,若没有可返回的值,将引发StopIteration异常

#可使用next(it)替换it.__next__()

例子:

class Fibs:

   def __init__(self):

       self.a = 0

       self.b = 1

   def __next__(self):

       self.a, self.b = self.b, self.a + self.b

       return self.a

   def __iter__(self):

       return self


2.从迭代器创建序列

class TestIterator:

   value = 0

   def __next__(self):

   self.value += 1

   if self.value > 10: reise StopIteration

   return self.value

   def __iter__(self):

       return self


ti = TestIterator()

list(ti)

7.生成器

生成器很复杂。

而生成器并非是必需,可以不使用生成器。

1.创建生成器

包含yield语句的函数被称为 生成器

生成器不是使用return返回一个值,而是可以生成多个值,每次一个。

每次使用yield生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始继续执行。

例子:

def flatten(nested):

for sublist in nested:

    for element in sublist:

        yield element

2.递归式生成器

def flatten(nested):

   try:

       for sublist in nested:

           for element in flatten(sublist):

               yield element

   except TypeError:

       yield nested

3.通用生成器


4.生成器的方法


外部可访问生成器的方法send。

生成器 yield返回一个值(通过send发送给外部)


5.模拟生成器

8.八皇后问题

目录
打赏
0
1
1
0
48
分享
相关文章
|
6天前
|
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
493 8
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
Python/Anaconda双方案加持!Jupyter Notebook全平台下载教程来袭
Jupyter Notebook 是一款交互式编程与数据科学分析工具,支持40多种编程语言,广泛应用于机器学习、数据清洗和学术研究。其核心优势包括实时执行代码片段、支持Markdown文档与LaTeX公式混排,并可导出HTML/PDF/幻灯片等格式。本文详细介绍了Jupyter Notebook的软件定位、特性、安装方案(Anaconda集成环境与原生Python+PIP安装)、首次运行配置及常见问题解决方案,帮助用户快速上手并高效使用该工具。
milvus-use教程 python
本项目参考vanna项目,获取数据库元数据和问题SQL对,存入Milvus向量数据库,并进行相似性检索。采用m3e-large嵌入模型,通过DatabaseManager类实现数据库连接持久化,MilvusVectorStore类封装了Milvus操作方法,如创建集合、添加数据和查询。项目提供init_collections、delete_collections等文件用于初始化、删除和管理集合。所用Milvus版本较新,API与vanna项目不兼容。 [项目地址](https://gitee.com/alpbeta/milvus-use)
125 9
Python语法糖详解教程
《Python语法糖详解教程》介绍了编程语言中的“语法糖”,即通过特殊语法形式简化代码,使代码更简洁、易读和高效。文章详细解析了列表推导式、字典推导式、元组解包、条件表达式、with语句和装饰器等核心语法糖,并提供了具体示例和最佳实践指南。通过这些技巧,开发者可以在保持底层功能不变的前提下,显著提升开发效率和代码质量。
52 8
【新手必看】PyCharm2025 免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!
PyCharm是由JetBrains开发的Python集成开发环境(IDE),专为Python开发者设计,支持Web开发、调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试和版本控制等功能。它有专业版、教育版和社区版三个版本,其中社区版免费且适合个人和小型团队使用,包含基本的Python开发功能。安装PyCharm前需先安装Python解释器,并配置环境变量。通过简单的步骤即可在PyCharm中创建并运行Python项目,如输出“Hello World”。
660 13
【新手必看】PyCharm2025 免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!
深入探讨 Python 列表与元组:操作技巧、性能特性与适用场景
Python 列表和元组是两种强大且常用的数据结构,各自具有独特的特性和适用场景。通过对它们的深入理解和熟练应用,可以显著提高编程效率和代码质量。无论是在数据处理、函数参数传递还是多线程环境中,合理选择和使用列表与元组都能够使得代码更加简洁、高效和安全。
53 9
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
Python中使用MySQL模糊查询的方法
本文介绍了两种使用Python进行MySQL模糊查询的方法:一是使用`pymysql`库,二是使用`mysql-connector-python`库。通过这两种方法,可以连接MySQL数据库并执行模糊查询。具体步骤包括安装库、配置数据库连接参数、编写SQL查询语句以及处理查询结果。文中详细展示了代码示例,并提供了注意事项,如替换数据库连接信息、正确使用通配符和关闭数据库连接等。确保在实际应用中注意SQL注入风险,使用参数化查询以保障安全性。
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
507 13

热门文章

最新文章