本篇讲解的魔术方法:

  • __new__

  • __init__

  • __del__

  • __repr__

  • __format__

  • __bytes__

1. __new__

在Python中,__new__ 方法是一个特殊的方法,用于控制对象的创建过程。理解 __new__ 方法的机制对于掌握Python的类和对象模型是很有帮助的。下面是对 __new__ 方法的详细介绍:

1.1 基本概念

  • __new__ 方法:这是一个类方法,通常用于创建并返回一个类的新实例。它在实例化对象时被自动调用,比 __init__ 方法更早执行。
  • 返回值__new__ 方法必须返回一个实例对象,通常是当前类的实例。如果返回 None,则不会调用 __init__ 方法。

1.2 方法签名

__new__ 方法的基本签名如下:

class MyClass:
def __new__(cls, *args, **kwargs):
# 创建并返回一个新的实例
instance = super().__new__(cls)
return instance
  • cls 参数:表示当前类的引用,类似于 self 参数。
  • *args**kwargs:表示传递给类构造函数的参数。

1.3 常见用法

1.3.1 基本实例化

当调用类构造函数(即类名加括号)时,__new__ 方法会被调用。例如:

class MyClass:
def __new__(cls, *args, **kwargs):
print("MyClass __new__ method called")
return super().__new__(cls) def __init__(self, value):
print("MyClass __init__ method called")
self.value = value obj = MyClass(10)

输出:

MyClass __new__ method called
MyClass __init__ method called
1.3.2 继承不可变类型

当继承不可变类型(如 intstrtuple 等)时,通常需要重写 __new__ 方法来创建对象,因为这些类型是不可变的,不能在 __init__ 方法中修改它们的值。例如:

class MyInt(int):
def __new__(cls, value):
print("MyInt __new__ method called")
return super().__new__(cls, value) num = MyInt(10)
print(num) # 输出: 10

1.3.3 单例模式

__new__ 方法可以用于实现单例模式,即确保一个类只有一个实例。例如:

class Singleton:
_instance = None def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance def __init__(self, value):
self.value = value obj1 = Singleton(10)
obj2 = Singleton(20)
print(obj1 is obj2) # 输出: True
print(obj1.value) # 输出: 10
print(obj2.value) # 输出: 10
1.3.4 元类

在元类中,__new__ 方法可以用于控制类的创建过程。例如:

class Meta(type):
def __new__(cls, name, bases, dct):
print("Meta __new__ method called")
return super().__new__(cls, name, bases, dct) class MyClass(metaclass=Meta):
pass obj = MyClass()

输出:

Meta __new__ method called

1.4 与 __init__ 方法的区别

  • __new__ 方法:负责创建实例对象,通常返回一个实例。
  • __init__ 方法:负责初始化实例对象,不返回任何值。

1.5 注意事项

  • 返回值__new__ 方法必须返回一个实例对象。如果返回 None,则不会调用 __init__ 方法。
  • 调用顺序__new__ 方法在 __init__ 方法之前被调用。
  • 类方法__new__ 方法是一个类方法,第一个参数是类本身(cls),而不是实例(self)。

通过理解 __new__ 方法的工作原理和常见用法,你可以更好地控制对象的创建过程,实现更复杂的类行为。

2. __init__

当然可以!__init__ 方法是 Python 中类的一种特殊方法,通常用作类的构造函数。在创建类的实例时,__init__ 方法会被自动调用。以下是对 __init__ 方法的详细介绍:

1. 基本概念

  • 构造函数__init__ 方法的主要作用是初始化类的实例。当一个新的对象被创建时,__init__ 方法会被调用。
  • 自动调用:你不需要显式地调用 __init__ 方法,它会在对象创建时自动被调用。
  • 参数__init__ 方法可以接受参数,这些参数可以在创建对象时传入。

2. 基本语法

class ClassName:
def __init__(self, param1, param2, ...):
self.attribute1 = param1
self.attribute2 = param2
# 其他初始化代码

3. 示例

class Person:
def __init__(self, name, age):
self.name = name
self.age = age # 创建 Person 类的实例
p1 = Person("Alice", 30) # 访问实例属性
print(p1.name) # 输出: Alice
print(p1.age) # 输出: 30

4. 初始化多个实例

class Person:
def __init__(self, name, age):
self.name = name
self.age = age # 创建多个 Person 类的实例
p1 = Person("Alice", 30)
p2 = Person("Bob", 25) print(p1.name) # 输出: Alice
print(p1.age) # 输出: 30
print(p2.name) # 输出: Bob
print(p2.age) # 输出: 25

5. 默认参数

你可以在 __init__ 方法中为参数提供默认值,这样在创建对象时可以不传入这些参数。

class Person:
def __init__(self, name, age=18):
self.name = name
self.age = age # 创建 Person 类的实例
p1 = Person("Alice", 30)
p2 = Person("Bob") # 使用默认年龄 18 print(p1.name) # 输出: Alice
print(p1.age) # 输出: 30
print(p2.name) # 输出: Bob
print(p2.age) # 输出: 18

6. 初始化复杂对象

__init__ 方法可以包含更复杂的初始化逻辑,例如创建其他对象、调用其他方法等。

class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.initialize_details() def initialize_details(self):
self.details = f"{self.name} is {self.age} years old." # 创建 Person 类的实例
p1 = Person("Alice", 30) print(p1.details) # 输出: Alice is 30 years old.

7. 继承中的 __init__ 方法

在继承中,子类可以重写父类的 __init__ 方法,也可以调用父类的 __init__ 方法。

class Person:
def __init__(self, name, age):
self.name = name
self.age = age class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age) # 调用父类的 __init__ 方法
self.student_id = student_id # 创建 Student 类的实例
s1 = Student("Alice", 20, "12345") print(s1.name) # 输出: Alice
print(s1.age) # 输出: 20
print(s1.student_id) # 输出: 12345

8. 注意事项

  • 不要滥用 __init__ 方法:虽然 __init__ 方法可以包含复杂的逻辑,但应尽量保持简洁,避免过度复杂化。
  • 调用父类的 __init__ 方法:在子类中重写 __init__ 方法时,如果需要初始化父类的属性,应调用父类的 __init__ 方法。

希望这些内容能帮助你更好地理解 __init__ 方法。如果有任何具体的问题或需要进一步的解释,请随时告诉我!

【Python】【魔术方法】(一)构造和初始化的更多相关文章

  1. 漫谈Python魔术方法,见过的没见过的都在这里了

    漫谈Python魔术方法,见过的没见过的都在这里了 就说一下,不深入 假的一览 提到魔术方法,学过python都应该知道一些.至少你得会__init__吧. 在我之前写的博文中有很多都涉及魔术方法.比 ...

  2. python魔术方法

    在类中有一些特殊的方法具有特殊的意义,比如__init__和__del__方法,它们的重要性我们已经学习过了. 一般说来,特殊的方法都被用来模仿某个行为.例如,如果你想要为你的类使用x[key]这样的 ...

  3. Python 魔术方法笔记

    魔术方法总是被__包围, 如__init__ , __len__都是常见的魔术方法,这里主要写一下我遇到的一些魔术方法 setitem 对某个索引值赋值时 即可以进行赋值操作,如 def __seti ...

  4. 记一次 Apache HUE 优化之因使用 Python 魔术方法而遇到的坑

    最近的工作是基于 Apache HUE 做二次开发.刚接手 HUE 的代码的时候,内心是崩溃的:开源的代码,风格很多种, 代码比较杂乱; 虽是基于 Django 开发的,但是项目的结构改变很大; 很多 ...

  5. Python魔术方法-Magic Method

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...

  6. Python 魔术方法指南

    入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教 ...

  7. python魔术方法总结

    获取属性 __ getattr __(self, name) 定义当用户试图获取一个不存在的属性时的行为 __ getattribute __(self, name) 定义当该类的属性被访问时的行为 ...

  8. 032.Python魔术方法__new__和单态模式

    一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...

  9. [python]魔术方法

    一.初始化: 1.__new__方法,初始化过程中第一个用到的方法(用处不大). 2.之后,__init__方法,构造方法. 3.最后,在对象回收时,调用__del__方法.如果解释器退出时,对象还存 ...

  10. Python 魔术方法及调用方式

    魔术方法 调用方式 解释 __new__(cls [,...]) instance = MyClass(arg1, arg2) __new__ 在创建实例的时候被调用 __init__(self [, ...

随机推荐

  1. 即时通讯技术文集(第35期):IM群聊技术合集(Part2) [共12篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第35 期. ​[- 1 -] 直播系统聊天技术(一):百万在线的美拍直播弹幕系统的实时推送技术 ...

  2. IM群聊消息的已读未读功能在存储空间方面的实现思路探讨

    1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...

  3. 从零开始的Python世界生活——语法基础先导篇(Python小白零基础光速入门上手)

    从零开始的Python世界生活--语法基础先导篇(Python小白零基础光速入门上手) 1. 准备阶段 1.1 下载并安装Python 1.1.1 下载步骤: 访问Python官方网站:点击这里下载P ...

  4. 将 EasySQLite 从 .NET 8 升级到 .NET 9

    前言 EasySQLite是一个.NET 8操作SQLite入门到实战的详细教程,主要是对学校班级,学生信息进行管理维护.今天咱们的主要内容是将EasySQLite从.NET 8升级到.NET 9. ...

  5. linux服务器下 conda 配置清华源

    安装miniconda 下载安装脚本 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Li ...

  6. .NET 中管理 Web API 文档的两种方式

    前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性.可维护性和一致性的关键.今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式,希望可以帮助到有需要的同学. ...

  7. biancheng-HBase

    目录http://c.biancheng.net/view/6509.html 1HBase是什么?2HBase的优势有哪些?3Hadoop与HBase的关系4HDFS5HDFS的特点与使用场景6HB ...

  8. docker没有vi不能执行yum报Device or resource busy

    最近在使用docker的过程中发现一个问题,就是想用vim编辑器编辑一个文件,发现连vi都没有. 于是想到一个办法用docker cp来解决问题: 首先执行docker ps -a查看容器的id 然后 ...

  9. Ubuntu手动安装Mysql包

    ubuntu通过tar包安装mysql5.7.21 1.下载解压命令见下: wget https://dev.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-l ...

  10. nginx 编译安装及配置解析

    一.编译安装 安装插件 安装需要的组件 yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel ...