Python 魔法方法总结及使用指南

33 回复

不错哦,mark 下


Python的魔法方法(Magic Methods)是那些以双下划线开头和结尾的特殊方法,它们允许你自定义类的行为,让对象能更好地与Python内置功能集成。下面是一些核心魔法方法的总结和使用示例。

1. 对象表示方法

  • __str__: 返回用户友好的字符串表示,用于print()str()
  • __repr__: 返回官方的、明确的字符串表示,用于调试和repr()
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        return f"Point({self.x}, {self.y})"
    
    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"

p = Point(3, 4)
print(str(p))    # Point(3, 4)
print(repr(p))   # Point(x=3, y=4)

2. 比较运算方法

  • __eq__: 定义==行为
  • __lt__: 定义<行为
  • __le__: 定义<=行为
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    
    def __eq__(self, other):
        return self.score == other.score
    
    def __lt__(self, other):
        return self.score < other.score

s1 = Student("Alice", 85)
s2 = Student("Bob", 90)
print(s1 < s2)   # True
print(s1 == s2)  # False

3. 算术运算方法

  • __add__: 定义+行为
  • __sub__: 定义-行为
  • __mul__: 定义*行为
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)  # Vector(4, 6)

4. 容器类型方法

  • __len__: 定义len()行为
  • __getitem__: 定义索引访问obj[key]
  • __setitem__: 定义索引赋值obj[key] = value
class MyList:
    def __init__(self, items):
        self.items = list(items)
    
    def __len__(self):
        return len(self.items)
    
    def __getitem__(self, index):
        return self.items[index]
    
    def __setitem__(self, index, value):
        self.items[index] = value

ml = MyList([1, 2, 3])
print(len(ml))    # 3
print(ml[1])      # 2
ml[1] = 99
print(ml[1])      # 99

5. 可调用对象方法

  • __call__: 让对象可以像函数一样被调用
class Multiplier:
    def __init__(self, factor):
        self.factor = factor
    
    def __call__(self, x):
        return x * self.factor

double = Multiplier(2)
print(double(5))   # 10
print(double(10))  # 20

6. 上下文管理器方法

  • __enter__: 进入上下文时调用
  • __exit__: 退出上下文时调用
class Timer:
    def __enter__(self):
        import time
        self.start = time.time()
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        import time
        self.end = time.time()
        print(f"耗时: {self.end - self.start:.2f}秒")

with Timer():
    import time
    time.sleep(1)

使用建议:

  • 只在确实需要自定义行为时使用魔法方法
  • 保持魔法方法的实现简单明了
  • 注意方法之间的关联性(如实现__eq__时通常也需要__hash__

一句话总结: 魔法方法是Python面向对象编程的核心机制,合理使用能让你的类更Pythonic。

mark 下

在我的 github 上,还有好多别的文章。

https://github.com/ltoddy

原:否包含特定的值 x in s s.contains(s)
修:是否包含特定的值 x in s s.contains(x)

这些应该是元编程的内容吧

这些是基础知识, 和 metaclass 不一样

所以平时写代码直接用内置方法?

英语机器翻译的?

元编程不是这个意思。
过去比如 a[key] 这样用的东西,可以 a.key 这样的同象形是元编程。

少年,还在找 Python 实习吗?

阐述一个属性 -> 删除一个属性

肯定找啊,南京,南京。

提报一处笔误,看下 PR

上海也行。

我这是 ubuntu,输入法超级垃圾,我想打产生的……

已经 merge 了。

上海的话可以来份简历:aHlwby5jaGVuQGRhb2Nsb3VkLmlvCg==

[email protected] 目前还没毕业,我在南京上大学,其实是想明年去上海的。 能不能加个好友私下聊一下……

文字内容看起来不是很想中文的语法,翻译过来的?

不是,转话风了。

好文章,mark

不错的总结,其实还有好多别的( https://github.com/laike9m/pdir2/blob/master/pdir/constants.py#L173-L383
一个建议是代码块周围最好加两个空格,这样看起来更美观

好的。

全文’右’字打错? ‘友’ -> ‘右’?
基础一节,补充 hex? id?
另外,最末尾的 weakref 那行,字号是不是有点小呢?

提出来的错别字都修改了,而且也都打赏感谢了。

上海考虑吗? https://www.v2ex.com/t/455631#reply5 里面有我们使用的 tech stack

回到顶部