拓展知识五:魔术方法

什么是魔术方法?

        魔术方法(Magic Methods)也被叫做特殊方法(Special Methods),在很多面向对象的编程语言里都存在。它们是一些名称被特殊定义的方法,通常会在特定场景下被系统自动调用,无需手动去调用。比如在 Python 里,魔术方法的名称以双下划线开头和结尾,像__init____str__这类。

魔术方法有什么作用?

        魔术方法的作用十分广泛。它能够让我们自定义类的行为,让类和对象的使用更加自然和灵活。例如,借助__init__方法,可以在创建对象时进行初始化操作;利用__str__方法,能够定义对象的字符串表示形式,方便打印输出;还有__add__方法,可用于定义对象之间的加法运算。

魔术方法和普通方法有什么区别?

  • 调用方式:普通方法需要我们在代码里手动调用,而魔术方法是在特定场景下由系统自动调用的。

  • 命名规则:魔术方法的名称以双下划线开头和结尾,这种命名方式是一种约定,用来标识它们是特殊方法。普通方法则没有这样的命名限制。

  • 功能用途:普通方法一般是为了实现类的特定业务逻辑,而魔术方法主要是用于自定义类的行为,让类和对象的使用更加符合 Python 的语法和习惯。

Python 魔术方法(举例)

创建与销毁相关

__new__

  • 用途__new__是类实例化时第一个调用的方法,它负责创建对象并返回该对象的实例。通常用于实现单例模式、元类或者在对象创建时进行一些高级控制。
  • 详细解释__new__方法接收的第一个参数是类本身,后续参数会传递给__init__方法。在单例模式中,__new__会检查类是否已经有实例存在,如果有则返回已有的实例,没有则创建新实例。
  • 示例
class Singleton:
    _instance = None
    def __new__(cls, *args, **kwargs):
        # 检查类是否已经有实例
        if cls._instance is None:
            # 调用父类的__new__方法创建新实例
            cls._instance = super().__new__(cls)
        return cls._instance

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

__init__

  • 用途:在__new__返回实例后,__init__方法会被自动调用,用于对对象进行初始化操作,为对象的属性设置初始值。
  • 详细解释__init__方法接收的第一个参数是实例本身,后续参数可以自定义,用于传递初始化所需的数据。
  • 示例
class Person:
    def __init__(self, name, age):
        # 为实例的属性赋值
        self.name = name
        self.age = age

p = Person("Alice", 25)
print(p.name, p.age)

__del__

  • 用途:当对象被销毁时,__del__方法会被调用。可以在这个方法中执行一些资源清理的操作,如关闭文件、释放数据库连接等。
  • 详细解释:需要注意的是,由于 Python 的垃圾回收机制,__del__方法的调用时机并不确定。当对象的引用计数为 0 时,垃圾回收机制可能会在某个时刻调用__del__方法。
  • 示例
class Resource:
    def __init__(self):
        print("Resource created")
    def __del__(self):
        print("Resource destroyed")

r = Resource()
del r

字符串表示相关

__str__

  • 用途:当使用print函数打印对象,或者使用str()函数将对象转换为字符串时,__str__方法会被调用。它应该返回一个用户友好的字符串表示。
  • 详细解释__str__方法的主要目的是提供一个易于阅读和理解的字符串,用于向用户展示对象的信息。
  • 示例
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

p = Person("Alice", 25)
print(p)

PHP 魔术方法(举例)

__construct()

  • 用途:PHP 的构造函数,当创建对象时自动调用,用于对象的初始化。
  • 详细解释:它允许在创建对象时传递参数,方便对对象的属性进行初始化设置。
  • 示例
<?php
class Person {
    public $name;
    public $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

$person = new Person("Bob", 30);
echo $person->name . " is " . $person->age . " years old.";
?>

__destruct()

  • 用途:析构函数,当对象被销毁时自动调用,可用于释放资源,如关闭数据库连接、文件句柄等。
  • 详细解释:析构函数在对象的生命周期结束时执行,不需要手动调用。
  • 示例
<?php
class DatabaseConnection {
    private $conn;

    public function __construct() {
        $this->conn = mysqli_connect("localhost", "user", "password", "database");
    }

    public function __destruct() {
        if ($this->conn) {
            mysqli_close($this->conn);
        }
    }
}

$db = new DatabaseConnection();
?>

__toString()

  • 用途:当对象被当作字符串使用时自动调用,返回一个字符串表示。
  • 详细解释:通常用于将对象的信息以字符串形式输出,例如在echo语句中使用对象时。
  • 示例
<?php
class Person {
    public $name;
    public $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    public function __toString() {
        return "Person(name={$this->name}, age={$this->age})";
    }
}

$person = new Person("Alice", 25);
echo $person;
?>

__call()

  • 用途:当调用一个对象中不存在的方法时,__call() 方法会被自动调用。
  • 详细解释:它接收两个参数,第一个是调用的方法名,第二个

 以下为你列举常见计算机语言里的魔术方法:

Python

创建与销毁

  • __new__:实例化对象时调用,负责创建对象。
  • __init__:对象创建后调用,用于初始化对象属性。
  • __del__:对象被销毁时调用,可进行资源清理。

字符串表示

  • __str__:使用printstr()时调用,返回用户友好的字符串。
  • __repr__:使用repr()时调用,返回可用于重建对象的字符串。

比较运算

  • __eq__:定义==比较。
  • __ne__:定义!=比较。
  • __lt__:定义<比较。
  • __le__:定义<=比较。
  • __gt__:定义>比较。
  • __ge__:定义>=比较。

容器操作

  • __len__:使用len()时调用,返回容器长度。
  • __getitem__:使用obj[key]访问元素时调用。
  • __setitem__:使用obj[key] = value设置元素时调用。
  • __delitem__:使用del obj[key]删除元素时调用。
  • __iter__:返回迭代器对象,用于迭代操作。
  • __next__:在迭代器中使用,返回下一个元素。

数值运算

  • __add__:定义+运算。
  • __sub__:定义-运算。
  • __mul__:定义*运算。
  • __truediv__:定义/运算。
  • __floordiv__:定义//运算。
  • __mod__:定义%运算。
  • __pow__:定义**运算。

PHP

构造与析构

  • __construct():对象创建时调用,用于初始化。
  • __destruct():对象销毁时调用,用于资源清理。

字符串表示

  • __toString():对象当作字符串使用时调用。

方法调用

  • __call():调用不存在的实例方法时调用。
  • __callStatic():调用不存在的静态方法时调用。

属性操作

  • __get():访问不存在的属性时调用。
  • __set():设置不存在的属性时调用。
  • __isset():对不存在的属性使用isset()empty()时调用。
  • __unset():对不存在的属性使用unset()时调用。

Java

Java 本身没有严格意义上像 Python 那样的 “魔术方法”,但有一些特殊用途的方法可看作类似概念:

构造与析构

  • 构造函数:创建对象时调用,用于初始化对象。
  • finalize():在对象被垃圾回收前调用,但不保证一定会被调用。

字符串表示

  • toString():返回对象的字符串表示。

比较运算

  • equals():定义对象相等比较。
  • compareTo():用于实现Comparable接口,定义对象排序规则。

Ruby

初始化与销毁

  • initialize:对象创建时调用,用于初始化。
  • __id__:返回对象的唯一标识符。

字符串表示

  • to_s:将对象转换为字符串。
  • inspect:返回对象的调试信息字符串。

方法调用

  • method_missing:调用不存在的方法时调用。

比较运算

  • ==:定义相等比较。
  • <=>:定义比较排序。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值