【Pyhont笔记】__new__和__init__

Python new init 方法详解 一直以为在python中init和c++中的构造函数异曲同工,后来无意间进行调试,发现__new__方法首先被调用。Python通过__new__方法实现类的实例化,返回对象,再调用__init__对类属性初始化。完成类的创建工作。 class User(object): def __new__(cls, *args, **kwargs): print("new") ... 阅读详情

一、先理解cls和self

此部分原文:python中self和cls的区别_python self()当成一个函数-优快云博客

假如你有个类MyClass,其中有个fun(arg1,arg2),以及一个实例obj,

当你应用中要通过实例类的方法,创建函数时必须加self参数,因为,当你调用方法obj.fun(arg1,arg2)的时候,会自动转成MyClass.fun(obj,arg1,arg2)

当你直接通过类调用方法时,可以不用sefl参数,如直接MyClass.fun(arg1,arg2),需加@staticmethod 修饰,否则会报错

若不想修饰,则建个module.py文件,不建类,则可直接如下方法使用:

import module

mudule.fun(arg1,arg2)

1、self表示一个具体的实例本身。如果用了staticmethod,那么就可以无视这个self,将这个方法当成一个普通的函数使用。

2、cls表示这个类本身。

>>> class A(object):
        def foo1(self):
            print "Hello",self
        @staticmethod
        def foo2():
            print "hello"
        @classmethod
        def foo3(cls):
            print "hello",cls


>>> a = A()

>>> a.foo1()          #最常见的调用方式,但与下面的方式相同
Hello <__main__.A object at 0x9f6abec>

>>> A.foo1(a)         #这里传入实例a,相当于普通方法的self
Hello <__main__.A object at 0x9f6abec>

>>> A.foo2()          #这里,由于静态方法没有参数,故可以不传东西
hello

>>> A.foo3()          #这里,由于是类方法,因此,它的第一个参数为类本身。
hello <class '__main__.A'>

>>> A                 #可以看到,直接输入A,与上面那种调用返回同样的信息。
<class '__main__.A'>

3、whats more,类先调用__new__方法,返回该类的实例对象,这个实例对象就是__init__方法的第一个参数self,即self是__new__的返回值。

二、再理解__new__和__init__

参考1:https://juejin.im/post/5add4446f265da0b8d4186af

参考2:https://zhuanlan.zhihu.com/p/21379984

__init__ 方法为初始化方法, __new__方法才是真正的构造函数

__new__方法用于创建对象并返回对象,当返回对象时会自动调用__init__方法进行初始化

调用过程,先__new__ 再 __init__

# coding:utf-8


class Foo(object):
    '''黄哥python培训,黄哥所写'''
    price = 50

    def how_much_of_book(self, n):
        print(self)
        return self.price * n

foo = Foo()
print(foo.how_much_of_book(8))
print(dir(Foo))

分析上面的代码,这个类实例化过程,Foo类继承object类,继承了object的__new__方法。

当你没有重写这个方法(通俗来说,你没有在Foo类中没有定义__new__方法),Foo实例化是默认自动调用父类__new__方法,这个方法返回值为类的实例提供这个函数how_much_of_book,默认的第一个参数self。

本质上,__new__ 中可以实现 __init__ 中的所有逻辑,但反过来不行。__init__通常更关注业务逻辑的初始化。

 单例模式的实现:

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kwargs)
            #或 cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)

        return cls._instance

s1 = Singleton()
s2 = Singleton()
print(s1)
print(s2) 

上面的代码输出

<__main__.Singleton object at 0x7fdef58b1190>
<__main__.Singleton object at 0x7fdef58b1190>

可以看到s1和s2都指向同一个对象,实现了单例模式。

工厂模式的实现

class Fruit(object):
    def __init__(self):
        pass

    def print_color(self):
        pass

class Apple(Fruit):
    def __init__(self):
        pass

    def print_color(self):
        print("apple is in red")

class Orange(Fruit):
    def __init__(self):
        pass

    def print_color(self):
        print("orange is in orange")

class FruitFactory(object):
    fruits = {"apple": Apple, "orange": Orange}

    def __new__(cls, name):
        if name in cls.fruits.keys():
            return cls.fruits[name]()
        else:
            return Fruit()

fruit1 = FruitFactory("apple")
fruit2 = FruitFactory("orange")
fruit1.print_color()    
fruit2.print_color()    

上面的代码输出

apple is in red
orange is in orange

cls可以传参数的:

class PriceLog(object):
    def __init__(self, timestamp, product_id, price):
        self.timestamp = timestamp
        self.product_id = product_id
        self.price = price
    def __repr__(self):
        return '<PriceLog ({}, {}, {})>'.format(self.timestamp,self.product_id, self.price)
    @classmethod
    def parse(cls, text_log):
        '''
         Parse from a text log with the format
            [<Timestamp>] - SALE - PRODUCT: <product id> - PRICE: $<price>
         to a PriceLog object
        '''
        divide_it = text_log.split(' - ')
        tmp_string, _, product_string, price_string = divide_it
        timestamp = delorean.parse(tmp_string.strip('[]'))
        product_id = int(product_string.split(':')[-1])
        price = Decimal(price_string.split('$')[-1])
        return cls(timestamp=timestamp, product_id=product_id,price=price)
    

So, the parsing can be done as follows:
>>> log = '[2018-05-05T12:58:59.998903] - SALE - PRODUCT: 897 - PRICE:
$17.99'
>>> PriceLog.parse(log)
<PriceLog (Delorean(datetime=datetime.datetime(2018, 5, 5, 12, 58, 59,
998903), timezone='UTC'), 897, 17.99)>

《探秘 BME680温度湿度气压气体传感器模块:环境感知的卓越之选》:此文为AI自动生成 BME680 是一款由博世公司推出的集成环境传感器模块,在环境监测和物联网等领域中发挥着重要作用。它能够同时测量温度、湿度、气压和气体浓度等多个环境参数,为各种应用提供准确可靠的环境数据。该模块采用小巧的封装形式,便于集成到各种设备中,无论是智能家居、可穿戴设备还是工业监测系统,都能轻松适配。例如,在智能家居系统中,BME680 模块可以监测室内环境参数,如温度、湿度、气压和空气质量等。通过与智能家居控制器或智能手机应用程序的连接,用户可以实时了解室内环境状况,并根据需要进行调整。 阅读详情

相关推荐

STM32鱼塘水质监测系统设计与实现

物联网技术在农业领域的应用正逐步深入,其中传感器网络作为关键基础设施,通过实时数据采集与传输实现环境监测。基于STM32微控制器的嵌入式系统因其高性能和低功耗特性,成为物联网终端设备的理想选择。该系统通过DS18B20水温传感器、PH传感器和浊度传感器组成的多参数检测网络,配合4G通信模块实现水质数据的远程监控。在农业物联网场景中,这种解决方案不仅大幅降低了传统人工检测的成本,更能通过实时预警有效预防养殖损失。本文介绍的鱼塘水质监测系统正是这一技术的典型应用,展示了如何通过STM32和常见传感器构建高性价比

weixin_42173218的博客 621

Python 中__new__方法介绍和用法

__new__ 的作用 在Python中__new__方法与__init__方法类似,但是如果两个都存在那么__new__闲执行。 在基础类object中,__new__被定义成了一个...

colours2009的博客 886

Jupyter实战:解决ModuleNotFoundError之xgboost缺失问题

本文详细解析了在Jupyter Notebook中遇到ModuleNotFoundError: No module named 'xgboost'错误的完整解决方案。通过诊断环境、使用pip正确安装xgboost、配置Python路径以及最终验证,帮助用户彻底解决模块缺失问题,并理解Jupyter内核与Python环境的关系,提升问题排查能力。

weixin_29064103的博客 384

python中cls和self的不同及使用

文章目录1.在类中不同方法2.cls是什么3.cls和self的不同4.补充写在最后 在讲正式内容之前,先讲一下背景知识 1.在类中不同方法 静态方法 类方法 实例方法 这里就详细说一下类方法 类方法绑定到一个类而不是类的对象。这些方法可以在没有类的实例的情况下调用。我们可以使用classmethod()方法或装饰器@classmethod创建类方法。类方法接受cls作为参数,指示该方法指向类而不是对象实例。 class Sample: var = "Class Variable" @c

Home to come 1万+

【计算机图形学】Pov-Ray画的垃圾小车

效果: 代码: #include "colors.inc" #include "metals.inc" #include "glass.inc" //相机 //这个位置车子刚好落在草地上了 camera { location direction z*1.5 right x*image_width/image_height look_at

lishichengyan的博客 1749

从帧结构到数据解析:深入理解CJ/T 188 MBUS水表通信协议

本文深入解析CJ/T 188 MBUS水表通信协议,从帧结构到数据解析提供完整指南。通过典型报文示例和实战案例,详细讲解地址域、控制码、数据标识符(DI)等关键字段的解析技巧,并分享校验算法与常见错误排查方法,帮助开发者快速掌握MBUS协议在水表通信中的应用。

weixin_28710999的博客 422

Python笔记 · self,cls,实例方法,静态方法,类方法

首先,`self`和`cls`并不是关键字,而是约定的统一命名规范。简单说:self用于指代实例/对象(Instance/Object),cls用于指代类(Class)。两者经常以参数形式出现在类方法中,通过它们,类方法可以读取或修改实例或类的状态,以及调用相关方法。

Laurence的技术博客 2100

Python实战:用SkillMetrics库5分钟搞定泰勒图绘制(附完整代码)

本文详细介绍了如何使用Python的SkillMetrics库快速绘制专业泰勒图,以直观对比多个模型的预测性能。通过整合相关系数、标准差和中心化均方根误差三个核心指标,该工具能帮助数据科学家和研究者高效完成模型评估与可视化,提升分析报告质量。文章提供了从环境配置、数据准备到高级定制与子图对比的完整代码示例。

7z8x2c4v6b9的博客 372

详解Python的__new__()方法

_new__与__init__的区别new() 方法主要存在于Python2的新式类和Python3中。它是负责创建类实例的静态方法。当Python实例化一个对象时,首先调用__new__()方法构造一个类的实例,并为其分配对应类型的内存空间,该实例的内存地址就是它的唯一标识符。然后再调用__init__()方法对实例进行初始化,通常是对该实例的属性进行初始化。以下用几个实例来说明:实例1:先调用__new__()方法再调用__init__()方法。

a1137588003的博客 4790

R语言中的混淆矩阵(Confusion Matrix)是一种常用的评估多分类模型性能的工具

除了准确率,混淆矩阵还提供了其他有用的指标,如灵敏度(Sensitivity)、特异度(Specificity)、精确度(Precision)和召回率(Recall)。混淆矩阵通过比较模型预测结果与实际标签的一致性,帮助我们了解模型的分类准确性和错误类型。此外,混淆矩阵还提供了各种错误类型的统计信息,如假阳性(False Positive)和假阴性(False Negative)等。通过混淆矩阵,我们可以了解模型的整体性能和错误类型,从而对模型进行评估和改进。最后,为了更好地理解混淆矩阵的结果,可以使用。

HackSquad的博客 972

【WRFDA第一期】WRF数据同化概述及资源整理

【WRFDA第一期】WRF数据同化概述及资源整理

WW、forever的博客 1658

一文详解Python中__new__方法的作用

点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤竹喧归浣女,莲动下渔舟。前言Python中类的构造方法__new__方法有何作用?Python类中有些方法名、属性名的前后都添加__双下画线,这种方法、属性通常属于Python的特殊方法和特殊属性。通过重写这些方法或直接调用这些方法来实现特殊功能。今天来聊聊构...

pdcfighting的博客 3124

【数字IC设计】芯片设计中的RDC

在芯片设计中,RDC是的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错误逻辑的模块,而使其它模块保持正常工作。

qq_40268672的博客 2185

Python类中cls和self的区别(staticmethod和classmethod的区别)

1、cls和self的区别: self:类的方法的第一个参数,表示一个具体的实例本身。如果类的方法用了修饰符“staticmethod”,则可以无视这个self,这个方法就当成一个普通的函数使用。 cls:若类方法用修饰符“classmethod”修饰,则cls作为类方法的第一个参数,表示这个类本身。 2、staticmethod和classmethod的区别: 一般来说,需要将类实例化后...

qq_41688455的博客 1799

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python __new__()分析

我们来看下下面类中对__new__()方法的实现: class Demo(object): def __init__(self): print '__init__() called...' def __new__(cls, *args, **kwargs): print '__new__() - {cls}'.format(cls=cls) ...

weixin_30654583的博客 306

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python面向对象中 `self` 与 `cls` 的区别及用法解析:中英双语

Use self in instance methods when working with object-specific data or behaviors. Use cls in class methods when working with shared data or operations at the class level

阿正的梦工坊 2870

python中cls和self的用法与区别

python中self表示类的实例化对象,cls表示类本身,classmethod修饰的类方法中可以通过cls来实例化对象,一般来说,一个类首先会调用new方法生成该类的实例化对象,所以init方法的第一个参数self便是new方法的返回值。

程序星空实验室 1512

python中定义类中cls和self的区别

a = A()a.foo1("world") # 输出hello worldA.foo1("world") # 输出hello worldclass A:a = 'a'print(A.a)print(A.foo2("xx")) #报错:unbound method foo2() must be called with A instance as first argument (got str instance instead)print(A.a)

result_reason的博客 869

python cls_深入浅析python 中的self和cls的区别

python 中的self和cls一句话描述:self是类(Class)实例化对象,cls就是类(或子类)本身,取决于调用的是那个类。@staticmethod 属于静态方法装饰器,@classmethod属于类方法装饰器。我们需要从声明和使用两个方面来理解。详细介绍一般来说,要使用某个类的方法,需要先⚠️实例化一个对象再调用方法。而使用@staticmethod或@classmethod,就可以...

weixin_39655085的博客 399

python new方法_Python中的__new__()方法的使用

__new__() 函数只能用于从object继承的新式类。先看下object类中对__new__()方法的定义:class object:@staticmethod # known case of __new__def __new__(cls,*more):# known special case of object.__new__""" T.__new__(S, ...) -> a new o...

weixin_39519741的博客 389

python中__new__方法学习

1.__new__方法介绍 首先我们要知道,python解释器在创建实例对象时做了两件事,分别为: 1.分配内存空间 2.为对象进行初始化 我们知道为对象进行初始化工作是内置函数__init__来进行的,而为对象分配内存空间则是内置函数__new__方法来进行的。 下面介绍下这个__new__方法: __new__方法是python解释器基类(object)的内置静态方法(虽然它没有静态修饰符@staticmethod),__new__方法的作用主要有两个: 1.为对象分配内存空间 2.返回

ysfscdn的博客 2256

Python 3 中 cls 和 self 参数的使用及注意事项

self 和 cls 参数在定义类的时候经常使用,但是很多小伙伴对其一知半解,现在明白了吗?self是实例方法的第一个参数,指代当前对象实例,可以通过它访问实例的属性和方法。cls是类方法的第一个参数,指代当前类本身,可以通过它访问类的属性和类方法。self和 cls都是 Python 面向对象编程中的重要概念,帮助区分实例与类的关系。参考文献python中cls和self的不同及使用_python cls和 self-优快云博客。

w8www的博客 1163

Python 之 __new__() 方法与实例化

__new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前,__new__() 决定是否要使用该 __init__() 方法,因为__new__() 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。

m0_59485658的博客 851

python中cls和self的区别

这种区分使得Python的面向对象编程更加灵活,允许你根据需要选择使用实例方法还是类方法。

qq_33566399的博客 497

python 笔记:cls VS self

【代码】python 笔记:cls VS self。

qq_40206371的博客 679

Python 中类的构造方法 __new__ 的妙用

Python 的类中,所有以双下划线__包起来的方法,叫魔术方法,魔术方法在类或对象的某些事件发出后可以自动执行,让类具有神奇的魔力,比如常见的构造方法__new__、初始化方法__ini...

somenzz的博客 841

Python中的__new__方法

只有继承于object的类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义__new__方法,一般用法如下: class...

weixin_41557802的博客 1万+
上一篇: 【python笔记】详解类class的继承、__init__初始化、super方法
下一篇: 【Pyhont笔记】装饰器总结
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值