python(57): 类与实例化

news/2025/4/1 18:33:26/

1.__new__ 与 __init__

class Test(object):def __init__(self, *args, **kwargs):  #第一个参数是当前类实例print("in init...")def __new__(cls, *args, **kwargs):print("in new...")return object.__new__(cls, *args, **kwargs)  #第一个参数当前类test = Test()

__new__: 

特性:

__new__() 方法是在类准备将自身实例化时调用。

__new__() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器。

Python 默认是调用该类的直接父类的 __new__() 方法来构造该类的实例,如果该类的父类也没有重写 __new__(),那么将一直按此规矩追溯至 object 的 __new__() 方法,因为 object 是所有新式类的基类。

作用:

实例化当前类并返回此实例对象

__init__:

特性:

第一个参数是当前类实例

作用:

初始化方法 -》初始化类实例

实例化过程

class Myclass(object):def __init__(self, x):self.x = xc1 = Myclass(11)                   #相当于隐式执行了__new__()和__init()
c2 = Myclass.__new__(Myclass, 12)  #显式调用__new__(),返回c2对象
c2.__init__( 12)                   #显示调用__init(),完成c2的初始化
print c1.x, c2.x输出: 11    12

__new__ 是先实例化一个对象, __init__ 是初始化一个对象,中间会自动调用。

新式类开始实例化时,__new__() 方法会返回 cls(cls 指代当前类)的实例,然后该类的 __init__() 方法作为构造方法会接收这个实例(即self)作为自己的第一个参数,然后依次传入 __new__() 方法中接收的位置参数和命名参数。

注意:如果 __new__() 没有返回 cls(即当前类)的实例,那么当前类的 __init__() 方法是不会被调用的。如果 __new__() 返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个类的构造方法。

新式类与经典类:2021年了你还不了解新式类与经典类? - 掘金

单例 -- 体现实例化在__new__中

 class Singleton(object):_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = object.__new__(cls, *args, **kwargs)return cls._instances1 = Singleton()
s2 = Singleton()
print(s1)
print(s2) 

2.类中方法分类

*实例方法:在类中定义的方法通常默认都是实例方法,包括构造方法。

实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用

**类方法:至少要有一个形式参数,通常命名为 cls,Python 会自动将类本身(注意:不是类对象)绑定给 cls 参数,无需显式为 cls 传参;并且类方法需要用 @classmethod 修饰符进行修饰。

类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。

*静态方法:静态方法需要使用 @staticmethod 修饰符进行修饰。

调用:即可以使用类名,也可以使用实例对象

3.类属性

*类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;

*类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;

*类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。

4.内部类

class MyOuter:age=18def __init__(self,name):self.name=nameclass MyInner:def __init__(self,inner_name):self.inner_name=inner_nameout=MyOuter('lqz')
inner=out.MyInner('lqz_inner')
print(inner.inner_name)

https://www.cnblogs.com/liuqingzheng/p/9504210.html

5.参考:

python 类的实例化的全过程 — A/B

https://www.cnblogs.com/111testing/p/13660863.html

 Python实例方法、静态方法和类方法详解(包含区别和用法)

https://www.cnblogs.com/liuqingzheng/p/9504210.html


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

相关文章

全球光伏知名企业-晶科能源联合泛微采知连,建立文控管理平台

晶科能源股份有限公司(简称“晶科能源”)是一家全球知名、极具创新力的太阳能科技企业。 (图片素材来自晶科能源官网) 公司战略性布局光伏产业链核心环节,聚焦光伏产品一体化研发制造和清洁能源整体解决方案提供&…

【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串

1字符数组初始化及传递 字符数组的定义方法与前面介绍的一维数组类似.例如, char c[10];字符数组的初始化可以采用以下方式. (1)对每个字符单独赋值进行初始化.例如, c[O]I;c[1] ;c[2]a;c[3]m;c[4] ;c[5]h;c[6]a;c[7]p;c[8]p;c[9]y;(2&am…

Python小项目:还在为备份烦恼?这个tkinter项目帮你解决!

文章目录 1 引言2 Tkinter概览3 设计备份软件的界面4 文件夹选择逻辑5 备份方案介绍5.1 完全备份5.2 增量备份5.3 镜像备份 完整代码: import tkinter as tk from tkinter import filedialog, messagebox import os import shutil import filecmpdef choose_source(…

redis数据安全(五)事务

一、概念: 1、介绍:Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命…

Docker(八)高级网络配置

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 高级网络配置 注意:本章属于 Docker 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习…

MySQL面试题:知道什么是覆盖索引吗?

覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到。 为什么用Id查询快,为什么不建议用selecte* 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。如果返回的…

Java 8的新特性简单分享(后续有系列篇~敬请期待)

Java 8的新特性分享 Java 8是Java语言迎来的一次革命性的更新,引入了众多强大的新特性,使得Java开发变得更加现代化和便捷。在这篇博客中,我们将深入探讨Java 8的一些主要特性,并通过丰富的案例演示展示它们的用法。 1. Lambda表…

RHEL - 更新升级软件或系统

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 小版本软件更新yum update 和 yum upgrade 的区别升级软件和升级系统检查软件包是否可升级指定升级软件使用的发行版本方法1方法2方法3方法4 查看软件升级类型更新升级指定的 RHSA/RHBA/RHEA更新升级指定的 CVE更新升级指定…