Python 魔法方法总结及使用指南
Python 魔法方法总结及使用指南
不错哦,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
mark
原:否包含特定的值 x in s s.contains(s)
修:是否包含特定的值 x in s s.contains(x)
这些应该是元编程的内容吧
这些是基础知识, 和 metaclass 不一样
所以平时写代码直接用内置方法?
英语机器翻译的?
ok
元编程不是这个意思。
过去比如 a[key] 这样用的东西,可以 a.key 这样的同象形是元编程。
少年,还在找 Python 实习吗?
阐述一个属性 -> 删除一个属性
肯定找啊,南京,南京。
提报一处笔误,看下 PR
上海也行。
我这是 ubuntu,输入法超级垃圾,我想打产生的……
已经 merge 了。
上海的话可以来份简历:aHlwby5jaGVuQGRhb2Nsb3VkLmlvCg==
文字内容看起来不是很想中文的语法,翻译过来的?
不是,转话风了。
mark!
好文章,mark
不错的总结,其实还有好多别的( https://github.com/laike9m/pdir2/blob/master/pdir/constants.py#L173-L383 )
一个建议是代码块周围最好加两个空格,这样看起来更美观
好的。
全文’右’字打错? ‘友’ -> ‘右’?
基础一节,补充 hex? id?
另外,最末尾的 weakref 那行,字号是不是有点小呢?
mark
mark
提出来的错别字都修改了,而且也都打赏感谢了。
上海考虑吗? https://www.v2ex.com/t/455631#reply5 里面有我们使用的 tech stack


