当前位置:首页 > 工具 > 正文内容

Python 魔术方法深度解析与面向对象实践

访客 工具 2026年5月27日 3

面向对象基础与动态特性

Python 中通过 class 关键字构建自定义类型。实例化时,解释器自动触发构造逻辑完成对象初始化。

class Human:
    def __init__(self, nickname):
        self.nickname = nickname

    def display(self):
        print(f"当前对象: {self.nickname}")

if __name__ == '__main__':
    h = Human("Alice")
    h.display()

运行时属性注入

Python 允许在实例创建后动态挂载属性,但该属性仅属于被操作的实例,不会扩散到其他对象。

class Human:
    def __init__(self):
        pass

if __name__ == '__main__':
    h = Human()
    h.nickname = "Alice"
    print(h.nickname)

组合模式

类的成员可以是另一个类的实例,形成"has-a"关系。

class Engine:
    def __init__(self, power):
        self.power = power

class Vehicle:
    def __init__(self, engine):
        self.engine = engine

v8 = Engine(450)
car = Vehicle(v8)

核心魔术方法详解

方法触发场景备注
__init__实例化后初始化非构造方法,构造由 __new__ 负责
__str__str()print()面向用户,可读性强
__repr__repr()、交互式解释器面向开发者,应能 eval(repr(obj)) == obj
__del__实例引用计数归零用于资源释放,不保证立即执行
__len__len()返回非负整数
__getitem__索引、切片访问obj[key]
__getattr__属性查找失败避免无限递归
__setitem__索引赋值支持 random.shuffle 等操作
__enter__/__exit__with 语句上下文管理协议
class Student:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"Student({self.name!r})"

    def __repr__(self):
        return f"Student(name={self.name!r})"

    def __len__(self):
        return len(self.name)

    def __getitem__(self, idx):
        return self.name[idx]

if __name__ == '__main__':
    s = Student("Bob")
    print(s)           # Student('Bob')
    print(len(s))      # 3
    print(s[0])        # B

运算符重载机制

算术运算符

运算符正向反向就地
+__add____radd____iadd__
-__sub____rsub____isub__
*__mul____rmul____imul__
/__truediv____rtruediv____itruediv__
//__floordiv____rfloordiv____ifloordiv__
%__mod____rmod____imod__
**__pow____rpow____ipow__
@__matmul____rmatmul____imatmul__

比较运算符

运算符方法默认行为
==__eq__基于 id() 判断
!=__ne__取反 __eq__ 结果
<__lt__抛出 TypeError
<=__le__抛出 TypeError
>__gt__抛出 TypeError
>=__ge__抛出 TypeError

一元运算符重载应返回新对象,而非修改操作数本身。

class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Vector({self.x!r}, {self.y!r})"

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)

    def __call__(self):
        print(f"向量坐标: ({self.x}, {self.y})")

v1 = Vector(2, 3)
v2 = Vector(1, 1)
print(v1 + v2)      # Vector(3, 4)
print(v1 * 3)       # Vector(6, 9)
v1()                # 向量坐标: (2, 3)

访问控制与封装

命名约定与可见性

class Employee:
    company = "TechCorp"      # 类属性,公有

    def __init__(self, name, salary):
        self.name = name
        self.__salary = salary   # 名称改写为 _Employee__salary

    def get_salary(self):
        return self.__salary

    def set_salary(self, value):
        if value > 0:
            self.__salary = value

    def __audit(self):           # 私有方法
        print("内部审计中...")

    def public_audit(self):
        self.__audit()

e = Employee("Tom", 5000)
print(e.name)           # Tom
print(e.get_salary())   # 5000
e.set_salary(6000)

继承体系设计

单继承与属性继承

class Base:
    def __init__(self, value):
        self.value = value
        self.__hidden = 100

class Derived(Base):
    def __init__(self, value, extra):
        super().__init__(value)   # 显式调用父类初始化
        self.extra = extra

d = Derived(10, 20)
print(d.value)          # 10
print(d._Base__hidden)  # 100 (名称改写访问,不推荐)

多继承与 MRO

class A:
    def __init__(self):
        print("A init")
        super().__init__()

class B(A):
    def __init__(self):
        print("B init")
        super().__init__()

class C(A):
    def __init__(self):
        print("C init")
        super().__init__()

class D(B, C):
    def __init__(self):
        print("D init")
        super().__init__()

print(D.__mro__)
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
d = D()

方法重写与扩展

class Logger:
    def log(self, msg):
        print(f"[INFO] {msg}")

class TimestampLogger(Logger):
    def log(self, msg):
        from datetime import datetime
        super().log(f"{datetime.now()}: {msg}")

tl = TimestampLogger()
tl.log("系统启动")

多态与类方法

class Dog:
    def speak(self):
        print("汪汪")

class Cat:
    def speak(self):
        print("喵喵")

def animal_sound(creature):
    creature.speak()

animal_sound(Dog())   # 汪汪
animal_sound(Cat())   # 喵喵

类方法与静态方法

class MathUtils:
    PI = 3.14159

    @classmethod
    def circle_area(cls, radius):
        return cls.PI * radius ** 2

    @staticmethod
    def is_positive(num):
        return num > 0

print(MathUtils.circle_area(5))    # 78.53975
print(MathUtils.is_positive(-3))   # False

模块组织与导入

# utils.py
threshold = 10

def helper():
    return "辅助功能"

class Tool:
    pass
# main.py
import utils
from utils import Tool, helper

# 处理命名冲突
import utils as u
def helper():
    pass

print(u.helper())   # 调用模块中的函数

Property 描述符

类属性方式

class Product:
    def __init__(self):
        self.__price = 0.0

    def get_price(self):
        return self.__price

    def set_price(self, value):
        if value >= 0:
            self.__price = value

    price = property(get_price, set_price)

p = Product()
p.price = 99.5
print(p.price)

装饰器方式(推荐)

class Product:
    def __init__(self):
        self.__price = 0.0

    @property
    def price(self):
        return self.__price

    @price.setter
    def price(self, value):
        if value >= 0:
            self.__price = value

    @price.deleter
    def price(self):
        del self.__price

p = Product()
p.price = 149.0
print(p.price)

魔术方法分类速查

类别方法
字符串表示__repr__, __str__, __format__, __bytes__
数值转换__abs__, __bool__, __complex__, __int__, __float__, __hash__, __index__
集合模拟__len__, __getitem__, __setitem__, __delitem__, __contains__
迭代协议__iter__, __reversed__, __next__
可调用对象__call__
上下文管理__enter__, __exit__
生命周期__new__, __init__, __del__
属性管理__getattr__, __getattribute__, __setattr__, __delattr__, __dir__
描述符协议__get__, __set__, __delete__

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。