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.八皇后问题

相关文章
|
4天前
|
设计模式 测试技术 Python
Python教程:一文了解PageObject模式
PageObject 模式通常用于 Web 应用程序的 UI 自动化测试,尤其是在使用 Selenium、Appium 、Airtest等工具进行测试时非常有效。但是,它并不局限于特定类型的应用或工具,而是一种通用的设计模式,可以用于任何需要进行 UI 自动化测试的场景。
18 5
|
4天前
|
存储 数据安全/隐私保护 计算机视觉
Python教程:一文了解从Bytes到Bits的数据转换
在Python编程中,处理数据时经常需要在字节(bytes)和位(bits)之间进行转换。这种转换在网络通信、数据加密、图像处理等领域尤为常见。本文将详细介绍如何在Python中进行字节与位之间的转换,并提供一个实用的功能:如何在指定的位位置替换位数据。
15 4
|
2天前
|
数据采集 存储 JSON
Python网络爬虫教程概览
【6月更文挑战第21天】Python网络爬虫教程概览:安装requests和BeautifulSoup库抓取网页;使用HTTP GET请求获取HTML,解析标题;利用CSS选择器提取数据;处理异步内容可选Selenium;遵循爬虫策略,处理异常,尊重法律与网站规定。
7 1
|
1天前
|
存储 JSON 数据格式
Python基础语法汇总【保姆级小白教程】
我将 Python语法分为14个章节,从第一章Python基础概念到第14章模块&异常处理,本篇文章将逐一为大家讲述.
30 0
Python基础语法汇总【保姆级小白教程】
|
4天前
|
设计模式 Python
Python教程:一文了解Python工厂模式
工厂模式是一种创建型设计模式,它用于创建对象的实例,而无需在客户端代码中指定具体的类。通过引入工厂类,客户端代码只需要与工厂接口进行交互,而不需要了解实际创建的对象的细节。这样可以将对象的创建和使用分离开来,提高了代码的灵活性和可维护性。
15 2
|
4天前
|
存储 JSON JavaScript
Python教程:一文了解Python中的json库
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,易于人类阅读和编写,也易于计算机解析和生成。在Python中,JSON通常用于数据交换和存储,因为它与Python的字典和列表类型相似。
16 2
|
1天前
|
Python
Python优雅遍历字典删除元素的方法
本文详细介绍了Python优雅遍历字典删除元素的五种方法,字典推导式是删除字典中元素的最常见且最优雅的方法,因为它清晰、简洁且易于理解。其他方法可能在某些特定情况下有用,但通常不如字典推导式通用或高效。
7 0
|
1天前
|
机器学习/深度学习 算法 索引
Python梯度提升决策树的方法示例
本文简要介绍了Python梯度提升决策树的方法示例,包括鸢尾花(Iris)数据集进行分类、房价预测(回归)、垃圾邮件分类、特征选择等示例。
7 0
|
7天前
|
测试技术 虚拟化 云计算
GitHub高赞!速通Python编程基础手册,被玩出花了!
随着云时代的来临,Python 语言越来越被程序开发人员喜欢和使用,因为其不仅简单易学,而且还有丰富的第三方程序库和相应完善的管理工具。 从命令行脚本程序到 GUI程序,从图形技术到科学计算,从软件开发到自动化测试,从云计算到虚拟化,所有这些领域都有 Python 的身影。 今天给小伙伴们分享的这份手册采用以任务为导向的编写模式,全面地介绍了 Python 编程基础及其相关知识的应用,讲解了如何利用 Python 的知识解决部分实际问题。
GitHub高赞!速通Python编程基础手册,被玩出花了!
|
4天前
|
开发者 Python
【干货】Python编程惯例
【干货】Python编程惯例
10 1