【Python 基础语法】面向对象程序设计(下)

简介: 【Python 基础语法】面向对象程序设计(下)

🚩前言


上节介绍到了类与对象的一些基本概念,今天主要分享一下类的实操。如何把一个类中的方法作为属性使用?如何把类变为一个迭代器,然后把生成的对象当列表一样被for循环进行迭代?如何实现将一个方法或者函数每次运行的环境保存下来?



➰类中的装饰器



💓基本概念


在函数学习的时候已经接触过了装饰器这个概念,今天再来重新提一下,装饰器可以为函提供一个最初的运行环境,在调用你写的函数之前,往往会先调用函数上方的装饰器,一个函数可以拥有多个装饰器。一般的用法如下:




import time
#装饰器函数
def timeit(func):
    def wrapper(*s):
        start=time.perf_counter()
        func(*s)
        end=time.perf_counter()
        print('运行时间:',end-start)
    return wrapper
#函数使用装饰器
@timeit
def mysum(n):
    sum=0
    for i in range(n):sum+=i
    print(sum)
#调用函数
mysum(10)


类中方法的装饰器有很多,只不过功能与函数有些不同,方法中的装饰器主要是为了限定方法的某些功能或者限定方法的类别。例如我们上节提到的@staticmethod@classmethod。今天着重介绍的是@property装饰器,他的作用可以让某些方法当做属性一样进行访问。默认的话只提供一个只读的权限,可以人为实现@getter@setter@deleter

property装饰器原型:proper(fget=None,fset=None,fdel=None,doc=None)


💓实现方式


Python中的实现可以将某些方法当做属性一样来访问、修改、删除已达到对某些属性的更好的封装。


第一种


class PTest1:
    def __init__(self,name):
        self.__name=name
    @property
    def getname(self):
        return self.__name
p=PTest1("xiaolan")
print(p.getname)


第二种


class PTest1:
    def __init__(self,name):
        self.__name=name
    @property
    def opname(self):
        return self.__name
    @opname.setter
    def opname(self,value):
        self.__name=value
    @opname.deleter
    def opname(self):
        self.__name=""
p=PTest1("xiaolan")
print(p.opname)
p.opname="123"
print(p.opname)
del p.opname
print(p.opname)


第三种


class PTestX:
    def __init__(self,name):
        self.__myname=name
    def getname(self):
        return self.__myname
    def setname(self,v):
        self.__myname=v
    def delname(self):
        self.__myname=""
    name=property(getname,setname,delname,"404 NotFond")
p=PTestX("xiaolan")
print(p.name)
p.name="123"
print(p.name)
del p.name
print(p.name)


➰类与迭代器的无缝衔接



💓基本概念


迭代器可以使用next()函数依次获取该迭代器内的下一个值,迭代器可以使程序更通用、优雅、高效、更具有Python编码风格。普通对象可以通过实现__iter__()与__next__()两个方法,使得对象变为可迭代对象,可以通过循环进行迭代。如果类只实现了__iter__()方法,该类生成的对象就变为了可迭代对象,只不过运行的时候会报TypeError: iter() returned non-iterator of type '**'如果只实现__next__()方法那么程序会报TypeError: '**' object is not iterable所以只有将类的两个方法都实现了,对象才会变为能够迭代的对象。__iter__()与__next__()方法又称为迭代器协议。


💓实现方式


将两方法实现一下,然后方法iter中返回对象本身,next返回你要返回的下一个值。


测试可迭代对象是否可迭代


import collections.abc
class ITClass:
    def __init__(self,name):
        self.__name=name
        self.a=1
    # 以下二者合称为迭代器协议
    def __iter1__(self):
        return self
    def __next__(self):
        self.a+=1
        return self.a
i1=ITClass("小黄")
# 测试对象是否可迭代
print(isinstance(i1,collections.abc.Iterable))
print(isinstance(ITClass,collections.abc.Iterable))
print(isinstance([1,2,3],collections.abc.Iterable))
# 测试对象是不是迭代器
print(isinstance(i1,collections.abc.Iterator))
print(isinstance(ITClass,collections.abc.Iterator))
print(isinstance((i for i in range(100)),collections.abc.Iterator))
# 只有i1对象的isinstance的两项结果都为True的时候才可以无限循环迭代。
for i in i1:
    print("Hello")


使用迭代器实现斐波那契数列


class fib:
    def __init__(self,nums):
        self.nums=nums
        self.a,self.b=0,1
        self.i=0
    def __iter__(self):
        return self
    def __next__(self):
        self.i+=1
        # 达到终止条件就抛出异常来终止否则会一直迭代下去
        if self.i>self.nums:
            raise StopIteration
        self.a,self.b=self.a+self.b,self.a
        return self.a
f=fib(100)
for i in f:
    print(i)


反向迭代器的实现


反向迭代器

实现了__reversed__方法的可迭代对象,可以使用reversed()反向迭代可迭代对象。

自己实现range可迭代对象


class Range:
    def __init__(self,startnums,endnums):
        self.endi=endnums
        self.a,self.b=0,1
        self.starti=startnums
    def __iter__(self):
        while self.starti<=self.endi:
            yield self.starti
            self.starti+=1
    def __reversed__(self):
        while self.starti<=self.endi:
            yield self.endi
            self.endi-=1
f1=Range(10,20)
for i in f1:
    print(i)
f2=reversed(Range(10,20))
for i in f2:
    print(i)


💓手写一个range函数


可以传入起始数值、结尾数值。默认步长是1,也可以自己传入,支持正反向迭代。


class Range:
    def __init__(self,startnums,endnums,dis=1):
        self.endi=endnums
        self.starti=startnums
        self.dis=dis
    def __iter__(self):
        i=self.starti
        j=self.endi
        if self.starti<self.endi:
            while i<=self.endi:
                yield i
                i+=self.dis
        else:
            while self.endi<=i:
                yield i
                i-=self.dis
f1=Range(10,30,2)
for i in f1:
    print(i)


➰生成器


💓基本概念


在函数中如果使用yield语句代替return 语句返回一个值,则定义了一个生成器函数 生成器函数使用yield语句返回一个值,然后保存当前函数的整个执行状态等待下一次调用(下次调用还从上次返回的时候开始)。生成器函数是一个迭代器,是可迭代对象、支持迭代。我记得这种生成器在scrapy框架中有使用,大家先记住这种语法与如何操作的即可,实际应用咱们后来再补充。


💓实现方式

def gentripls(n):
    for i in range(n):
        yield i*3
f=gentripls(10)
for i in f:
    print(i)
# 生成器表达式
# 生成器表达式与列表推导式基本一样,只不过使用()代替了[]
ls=(1,2,3,4,5,6)
for i in ls:
    print(i)



相关文章
|
6月前
|
人工智能 Ubuntu IDE
【Python】基础:环境配置与基础语法
本文介绍了Python编程语言及其环境配置方法。Python由Guido van Rossum于1991年创建,以其简洁、易学和强大的功能著称。文章详细讲解了Python的主要特点、Windows和Ubuntu下的安装配置步骤、基础语法、控制流、函数、文件操作、模块使用及面向对象编程等内容,帮助读者快速入门Python编程。
203 4
|
5月前
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
121 7
|
1月前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
1月前
|
Python
课时19:Python的基本语法
今天给大家带来分享的是 Python 的基本语法,分为以下六个部分。 1.在 Python 中严格区分大小写 2.Python 中的每一行就是一条语句,每条语句以换行结束 3.Python 中每一行语句不要过长 4.条语句可以分多行编写,语句后边以\结尾 5.Python 是缩进严格的语言,不要随便写缩进 6.在 Python 中使用#来表示注释
|
3月前
|
存储 开发者 Python
python基本语法
Python的基本语法简洁而强大,支持多种编程范式,包括面向对象编程和函数式编程。通过掌握变量和数据类型、操作符、控制结构、函数、类和模块等基本概念,可以有效地编写高效、可读的Python代码。无论是初学者还是经验丰富的开发者,Python都提供了丰富的工具和库来满足各种编程需求。
147 13
|
5月前
|
存储 索引 Python
Python 的基本语法
这些是 Python 的基本语法要素,掌握它们是学习和使用 Python 的基础。通过不断地实践和应用,你将能够更深入地理解和熟练运用这些语法知识,从而编写出高效、简洁的 Python 代码
248 61
|
4月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
5月前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
113 1
|
5月前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
5月前
|
存储 Python Perl
python正则语法
本文介绍了正则表达式的基础知识及其在 Python 中的应用。首先解释了为什么要使用正则表达式,通过一个判断手机号的示例展示了正则表达式的简洁性。接着详细介绍了 `re` 模块的常用方法,如 `match()`、`search()`、`findall()`、`finditer()` 等,并讲解了正则表达式的基本语法,包括匹配单个字符、数字、锚字符和限定符等。最后,文章还探讨了正则表达式的高级特性,如分组、编译和贪婪与非贪婪模式。
59 2

热门文章

最新文章

下一篇
oss创建bucket