9.2、面向对象高级特性(类方法和静态方法、property类属性、单例模式)

news/2024/10/21 22:21:19/

文章目录

  • 类方法和静态方法
  • property类属性
  • 单例模式
    • 基于装饰器实现
    • 使用_ _ new _ _方法实现
  • 面向对象总结

类方法和静态方法

类里面定义的方法称为实例方法,python解释器会自动将对象(或实例)传入方法【pycharm中会自动将self传入,self代表对象】
如果不想自动传入self 对象,希望python解释器自动传入类名,那么就需要使用类方法
静态方法不需要让python解释器传任何东西,python解释器不会自动传入任何参数。

类方法是类对象所拥有的方法,需要用修饰器一般以 @classmethod 来标识其为类方法,
1). 对于类方法,第一个参数必须是类对象,作为第一个参数
(cls是形参, 可以修改为其它变量名,但最好用’cls’了)
2). 能够通过实例对象和类对象去访问。
静态方法需要用修饰器一般以 @staticmethod 来标识其为静态方法,
1). 静态方法不需要多定义参数
2). 能够通过实例对象和类对象去访问。

class Student(object):def __init__(self, name, age):self.name = nameself.age = age# 实例方法, python解释器会自动将对象/实例传入方法。def get_age(self):print('self:', self)return  self.age# 类方法:python解释器会自动将类传入方法。@classmethoddef get_cls(cls):print('cls:', cls)# 静态方法:python解释器不会自动传入对象和类名# 可以正常传递别的参数@staticmethoddef get_info(name,age):print("static method信息",name,age)if __name__ == '__main__':s = Student('张三', 18)s.get_age()s.get_cls()s.get_info('张三', 18)

在这里插入图片描述

property类属性

类属性:将类方法变成类属性的过程
【调用类方法的时候只需要对象名.方法名。方法名后面不需要加括号,使得代码更加简洁】
【实例:将类方法object.year()转变成类属性object.year。】

类属性应用需求: 对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:
1、根据用户请求的当前页和总数据条数计算出 m 和 n
2、根据m 和 n 去数据库中请求数据

class Page:"""数据库内容:[user1, user2, user3......user100]page=2, per_page=10第一页: start=0 end=10第二页: start=10 end=20第三页: start=20 end=30....第page页: start=(page-1)*per_page end=page*per_page"""def __init__(self, page, per_page=10):self.page = pageself.per_page = per_page@propertydef start(self):return (self.page - 1) * self.per_page@propertydef end(self):return self.page * self.per_page
if __name__ == '__main__':content = ['content' + str(i + 1) for i in range(101)]p = Page(10, 5)print(content[p.start:p.end])

在这里插入图片描述

单例模式

简单来说,单例模式就是一个类只能构建一个对象的设计模式

对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

class People(object):passp1 = People()  # object
p2 = People()  # object
print(p1, p2)  

每个对象的内存地址不同,肯定不是单例模式
在这里插入图片描述

基于装饰器实现

from functools import wraps
# 使用装饰器来装饰类
def singleton(cls):#通过一个字典存储类和对象信息{"class":"object"},#需要实例化对象的时候,就将类名作为key值,对象名作为value值。#若已实例化对象过,当再次实例化对象的时候,就将已经有的对象即value值返回instances={}@wraps(cls)def wrapper(*args,**kwargs):# 为了保证单例模式,判断该类是否已经实例化对象# 1、如果有对象,直接返回存在的对象# 2、如果没有,则实例化对象,并存储类和对象到字典中,最后返回if instances.get(cls):return instances.get(cls)object=cls(*args,**kwargs)instances[cls]=objectreturn objectreturn wrapper@singleton
class People:passp1=People()
p2=People()
#查看是否单例模式
print(p1 is p2) #p1和p2值是否相同以及内存地址是否相同

在这里插入图片描述

使用_ _ new _ _方法实现

_ _ new _ _方法在实例化对象之前执行,用于创建对象
_ _ init _ 方法用于将对象和属性绑定,在 _ new _ _方法之后执行

class People(object):def __init__(self):print("执行__init__方法")def __new__(cls,*args,**kwargs):print("执行__new__方法")return object.__new__(cls) #执行父类object的new方法p1=People()

在这里插入图片描述

class People(object):_instance = Nonedef __new__(cls, *args, **kwargs):#创建对象之前执行的内容if cls._instance is None:cls._instance = object.__new__(cls)  # 调用父类的new方法创建一个对象return cls._instancedef __init__(self):"""在new方法之后执行, 将属性和对象封装在一起"""print("执行__init__方法")p1 = People()
p2 = People()
print(p1 is p2, p1, p2) #p1和p2内存地址相同,是同一个对象

在这里插入图片描述

面向对象总结

"""
面向对象:1. 三大特性封装(非常重要):__new__: 在实例化对象之前执行的, 返回对象。__init__: 构造方法, 实例化对象时自动执行。 常用于将对象和属性绑定在一起。self: 实质上是对象。继承(非常重要):多继承算法: python3中广度优先算法。私有属性和私有方法:只能在类里面访问和操作,类外部和子类不能访问多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果2. 三大特性的应用1). 链表的封装2). 栈的封装3). 队列的封装4). 二叉树的封装与遍历3. 高级特性1). @classmethod和@staticmethod(类方法和静态方法)2). @property类属性,使得代码更加简洁3). 单例模式: 一个类只能实例化一个对象基于装饰器基于new方法
"""

http://www.ppmy.cn/news/1510.html

相关文章

DiffuSEEG:一种基于stable diffusion 的SEEG数据补全方法

目录一. 立体脑电图(SEEG)1.1 SEEG概念1.2 SEEG作用1.3 SEEG的适用场景1.4 操作方法一. 立体脑电图(SEEG) 1.1 SEEG概念 立体脑电图(SEEG):是一种借助外科微创的方法将电极植入到大脑不同的部…

图像处理:模糊图像判断

目录 上期回顾 采用Laplace算子的原因 实现的效果 图片素材 代码的展示与讲解 效果展示 项目资源 上期回顾 上一次的图像清晰度评价没有成功,主要的原因是那几张图像清晰度评价函数都实际都采用了梯度求解,不同的场景灰度的明暗不同,…

SpringBoot项目--如何不停服更新应用?

原文网址:SpringBoot项目--如何不停服更新应用?_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java后端项目如何不停机更新服务。 在生产环境中,一般都会每个服务部署多个实例。只要多于1个实例,就可以不停服更新应用。 不停服…

【从零开始玩量化13】quantstats:分析你的量化策略

背景 之前总结了一些获取量化数据的途径,数据是一个量化策略的“原材料”,接下来要考虑的问题就是如何使用这些数据。 本文,介绍一个量化指标分析工具quantstats,利用它可以很方便的分析你的策略。 Github地址:https…

Objective-C中weak实现原理

Objective-C的对象采用引用计数来管理内存,如果对象被强持有,这个对象的引用计数会增加,如果对象被弱持有,这个对象的引用计数不会增加。弱持有也就是weak如何实现的呢?首先看下weak相关底层实现用到的数据结构&#x…

使用xlsxwriter简单的将截图插入excel表格中

1.xlsxwriter插入图片 原因: 有个小项目需要测出数据,然后把仪表上截图给插入excel中。 在网上查了一下,发现用xlsxwriter插入图片挺方便的。 import xlsxwriterduang xlsxwriter.Workbook("data.xlsx") sheet duang .add_work…

用Hopper修改代理软件端口

背景 用代理软件可以访问google,但是端口经常不固定,从缺省1080变成了随机。 前几天其实已经用Hopper 3.0看了一次,但是好像不支持go,所以没反编译成功,这次换了4.0,支持了go。 Hopper与逆向 逆向的目的…

数据结构和算法之如何建立图

小白BG.1 邻接矩阵表示的图结点的结构 typedef struct GNode *PtrToGNode;//PtrToGNode是指向GNode的一个指针 struct GNode{ int Nv;//顶点数 int Ne;//边数 WeightType G[MaxVertexNum][MaxVertexNum]; DataType Data[MaxVertexNum];//存顶点的数据 }; typedef PtrToGNode MG…