python中特殊的静态方法__new__

一、关于new方法

在Python中,__new__方法是一个特殊的静态方法,用于实例化对象。通常不需要直接调用__new__方法,Python会自动调用它来分配内存空间并返回一个新对象(或者更具体地说,是对象的引用)。然而,在某些特殊情况下,比如设计模式中,使用__new__方法来限制只能创建特定数量的实例;你需要重写__new__方法来控制对象的创建过程。

__new__方法的典型用法是当你需要控制对象的创建过程,比如实现单例模式、确保只创建特定类型的对象等。

__new__方法的基本使用结构如下:

class MyClass:  def __new__(cls, *args, **kwargs):  # 在这里,cls 是类本身,而不是类的实例  # 你需要调用父类的 __new__ 方法来实际创建对象  # 例如,如果你继承自 object(所有类的基类),你应该这样做:  instance = super().__new__(cls)  # 在这里,你可以对 instance 进行任何需要的初始化  # 最后,返回 instance  return instance  def __init__(self, *args, **kwargs):  # 在这里进行对象的常规初始化  pass

注意,__new__方法的第一个参数是类本身(通常命名为cls),而不是类的实例。此外,你需要调用父类的__new__方法来实际创建对象。这通常是通过super().__new__(cls)来实现的。


二、使用__new__方法来限制只能创建特定数量的实例

LimitedInstances类使用__new__方法来跟踪已创建的实例数量,并在达到最大限制时阻止创建更多实例。

class LimitedInstances:  _instances = 0  _max_instances = 3  # 限制本类只允许创造3个实例def __new__(cls, *args, **kwargs):  if cls._instances >= cls._max_instances:  raise Exception("Cannot create more instances")  cls._instances += 1  instance = super().__new__(cls)  return instance  def __init__(self, name):  self.name = name  def __del__(self):  # 注意:这只是一个简单的示例,用于演示。在真实场景中,可能需要更复杂的逻辑来处理实例删除。  LimitedInstances._instances -= 1  # 创建实例  
a = LimitedInstances("Instance A")  
b = LimitedInstances("Instance B")  
c = LimitedInstances("Instance C")  # 尝试创建更多实例将引发异常  
try:  d = LimitedInstances("Instance D")  
except Exception as e:  print(e)  # 输出: Cannot create more instances

三、其他设计模式

在Python中,我们可以使用类来实现各种设计模式,如单例模式、工厂模式、观察者模式等。

3.1 单例模式(Singleton Pattern)

单例模式确保一个类仅有一个实例,并提供一个全局访问点。

class Singleton:  _instance = None  def __new__(cls, *args, **kwargs):  if cls._instance is None:  cls._instance = super().__new__(cls)  return cls._instance  # 使用示例  
singleton1 = Singleton()  
singleton2 = Singleton()  
assert singleton1 is singleton2  # 应该是同一个实例

3.2 工厂模式(Factory Pattern)

工厂模式用于封装对象的创建过程,使得代码更加灵活和可维护。

class Car:  def __init__(self, brand):  self.brand = brand  class CarFactory:  def create_car(self, brand):  return Car(brand)  # 使用示例  
factory = CarFactory()  
bmw = factory.create_car("BMW")  
toyota = factory.create_car("Toyota")

3.3抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
参见博客,python标准库abc的使用方法:ABC, abstractmethod

from abc import ABC, abstractmethod  class AbstractCarFactory(ABC):  @abstractmethod  def create_sedan(self):  pass  @abstractmethod  def create_suv(self):  pass  class GermanCarFactory(AbstractCarFactory):  def create_sedan(self):  return Sedan("BMW")  def create_suv(self):  return SUV("Audi")  class JapaneseCarFactory(AbstractCarFactory):  def create_sedan(self):  return Sedan("Toyota")  def create_suv(self):  return SUV("Honda")  class Car:  def __init__(self, brand):  self.brand = brand  class Sedan(Car):  pass  class SUV(Car):  pass  # 使用示例  
german_factory = GermanCarFactory()  
sedan = german_factory.create_sedan()  
suv = german_factory.create_suv()

3.4观察者模式(Observer Pattern)

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新。

class Subject:  def __init__(self):  self._observers = []  self._state = None  def attach(self, observer):  if observer not in self._observers:  self._observers.append(observer)  def detach(self, observer):  try:  self._observers.remove(observer)  except ValueError:  pass  def notify(self):  for observer in self._observers:  observer.update(self._state)  def set_state(self, state):  self._state = state  self.notify()  class Observer:  def update(self, state):  pass  class ConcreteObserver(Observer):  def update(self, state):  print(f"Received state: {state}")  # 使用示例  
subject = Subject()  
observer = ConcreteObserver()  
subject.attach(observer)  
subject.set_state("New state")  # 输出: Received state: New state

Tips

  1. 设计模式主要用于解决在软件设计和开发中经常遇到的特定问题,它们提供了一种可重用的解决方案,使得代码更加健壮、可维护和可扩展。
  2. 单例模式 (Singleton Pattern):避免频繁创建和销毁对象导致的性能开销。应用-配置管理类:确保应用程序只加载一次配置文件,并提供一个全局访问点来获取配置信息。日志记录器:确保整个应用程序中只有一个日志记录器实例,以避免日志信息混乱。
  3. 工厂模式 (Factory Pattern):封装对象的创建过程,使得代码更加灵活和可维护。解耦对象的创建与使用,使得代码更加清晰。应用说明-数据库连接工厂:根据配置信息动态创建不同类型的数据库连接对象。邮件发送工厂:根据邮件类型(如文本邮件、HTML邮件)创建不同的邮件发送对象。
  4. 抽象工厂模式 (Abstract Factory Pattern):应用说明-UI工具包:为不同平台(如Windows、Linux)创建一组UI组件(如按钮、文本框)。游戏角色工厂:根据游戏类型(如角色扮演、射击游戏)创建一组游戏角色和装备。
  5. 观察者模式 (Observer Pattern):定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。实现事件驱动编程。应用说明-用户界面:当数据模型发生变化时,所有依赖于该数据的视图都会自动更新。股票交易系统:当股票价格发生变化时,所有订阅了该股票的用户都会收到通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频怎么转换成二维码图片?视频做成二维码播放的方法

怎样在电脑上制作可以播放视频的二维码呢?很多日常生活中,很多的场景或者物品都会有自己的二维码,其他人通过扫码就可以获取对应的内容。有很多场景下会把视频转换二维码,通过扫码在手机上查看视频内容,比如产品介绍、…

水表电表远程抄表是什么?

1.简述:水表电表远程抄表技术性 随着时代的发展,传统式手动抄表方法早已被更为高效、智能化的远程抄表系统所替代。水表电表远程抄表,说白了,就是利用互联网技术完成对水表和电表读数的远程数据采集管理方法,大大提升…

效果炸裂!使用 GPT-4o 快速实现LLM OS

▼最近直播超级多,预约保你有收获 —1— 什么是 LLM OS? 关于 LLM OS 的最初构想源自karpathy 在2023年11月11日发布的一条Twitter 动态,这是 LLM OS 概念的最早出处,如下图所示: LLM OS 主要有以下5个部分组成&#x…

基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法,对比两个算法的仿真时间,收敛曲线,以及路径规划的结果&#xff0…

中间件的概念及示例

什么是中间件? 中间件是一种软件技术,它在分布式系统中起着至关重要的作用。以下是关于中间件的详细解释: 定义与位置: 中间件是位于应用系统和系统软件之间的一类软件。它使用系统软件提供的基础服务(功能&#xff0…

Flask+Vue+MySQL天水麻辣烫管理系统设计与实现(附源码 配置 文档)

背景: 同学找到我期望做一个天水麻辣烫的网页,想复用以前做过的课设,结合他的实际需求,让我们来看看这个系统吧~ 项目功能与使用技术概述: 里面嵌入了6个子系统,其中餐饮系统可以进行餐馆信息添加、修改…

TypeScript体操类型练习

历史小剧场 这个世界上,有两种人最痛苦,第一种是身居高位者,第二种是身居底层者,第一种人很少,第二种人很多。第一种人叫崇祯,第二种人叫百姓。 而最幸福的,就是中间那拨人,主要工作…

Influence blocking maximization on networks: Models, methods and applications

abstract 由于各种社会和贸易网络的不断出现,网络影响力分析引起了研究者的极大兴趣。基于不同的影响力传播模型,人们提出了许多网络影响力最大化的新模型和方法。作为传统影响力最大化问题的延伸和扩展,影响力封锁最大化问题已成为研究热点&…

借助 CloudFlare 增强站点内容保护防采集

今天在一位站长的帮助下实测了 CloudFlare 增强站点内容保护实现防采集的功能,效果那是杠杠的,如果您的站点原创内容比较多的话,明月强烈建议试试 CloudFlare 这个内容保护,无论是 WordPress 、Typecho 都有非常好的效果,并且几乎没有任何误伤,搜索引擎爬虫蜘蛛更是不会影…

【图论】单源最短路

前言 今天&#xff0c;我们来讲最短路&#xff0c;首先看只有一个起点&#xff08;单源&#xff09;的情况。 为了书写方便&#xff0c;我们约定以下内容&#xff1a; template<class W> using Graph vector<vector<pair<int, W>>>; // 邻接表(ve…

集中抄表电表是什么?

1.集中抄表电表&#xff1a;简述 集中抄表电表&#xff0c;又称为远程抄表系统&#xff0c;是一种现代化电力计量技术&#xff0c;为提升电力行业的经营效率和客户服务质量。它通过自动化的形式&#xff0c;取代了传统人工抄水表&#xff0c;完成了数据信息实时、精确、高效率…

进制转换【野路子改造】

非科班&#xff0c;一直都是自己的野路子&#xff0c;现在要回炉重造 十进制->二进制 基本思想&#xff1a; 开始写的&#xff08;80%&#xff09;&#xff1a; #include<stdio.h> using namespace std; int main(){ int n; scanf("%d",&n); int a[1…

Spring -- DI

文章目录 一、什么是DI二、注入的三种方式2.1 属性注入 Autowired使用方法Autowired存在的问题以及解决方法Autowired问题的解决方法 2.2 构造方法注入2.3 setter方法注入2.4 三种注入方式优缺点分析 一、什么是DI 概念&#xff1a;DI(依赖注入)就是当我们把依赖对象取出来(创…

以太坊钱包

以太坊钱包是你通往以太坊系统的门户。它拥有你的密钥&#xff0c;并且可以代表你创建和广播交易。选择一个以太坊钱包可能很困难&#xff0c;因为有很多不同功能和设计选择。有些更适合初学者&#xff0c;有些更适合专家。即使你现在选择一个你喜欢的&#xff0c;你可能会决定…

mac m1 pcre.h 找不到

安装suricata报错&#xff1a; configure: error: pcre.h not found ... 解决&#xff1a; brew install pcre 找到这个文件的地址 brew list pcre | grep pcre.h$ /opt/homebrew/Cellar/pcre/8.45/include/pcre.h 程序搜索的地址 cpp -v /Library/Developer/CommandLineT…

5.26 基于UDP的网络聊天室

需求&#xff1a; 如果有人发送消息&#xff0c;其他用户可以收到这个人的群聊信息 如果有人下线&#xff0c;其他用户可以收到这个人的下线信息 服务器可以发送系统信息实现模型 模型&#xff1a; 代码&#xff1a; //chatser.c -- 服务器端实现 #include <stdio.h>…

hive初始化失败报错:Error: Duplicate key name ‘PCS_STATS_IDX‘ (state=42000,code=1061)

意思是key name ‘PCS_STATS_IDX’ (state42000,code1061)重复了&#xff0c;问题出在不是第一次初始化&#xff0c;因为我们在hive-site.xml中配置了 javax.jdo.option.ConnectionURL jdbc:mysql://192.168.200.137:3306/metastore?createDatabaseIfNotExisttrue JDBC conne…

JavaSE——类和对象(二)~~封装

目录 一.封装 二.封装扩展之包 三.static成员 四. 代码块 五. 内部类&#xff08;重要&#xff09; 大家好呀&#xff0c;我是北纬&#xff0c;接着上节我们继续讲解Java中关于类和对象的相关知识&#xff0c;今天着重给大家介绍一下关于面向对象程序的特性之一——封装。…

【Linux】常用基础命令 | 搭建云服务器优化环境 | 程序的部署

文章目录 Linux常用命令及搭建环境一、LinuxLinux发行版 1.常用命令1.ls2.cd3.pwd4.touch5.cat6.echo7.vim8.mkdir9.rm10.mv11.cp12.man13.grep14.ps15.netstat 2.搭建Java Web程序的运行环境包管理器1.安装JDK2.安装Tomcat3.安装mysql 3.程序的部署 Linux常用命令及搭建环境 …

贪心算法简单介绍

贪心算法是一种在每一步选择中都采取当前状态下最优或最优近似的选择&#xff0c;以期望最终得到全局最优解的算法。贪心算法并不总能得到全局最优解&#xff0c;但在某些问题上&#xff0c;它可以得到全局最优解&#xff0c;并且比动态规划等其他方法更为简单和高效。 贪心算…