
一、__init__:初始化方法含义与作用
你知道吗?每次用类造人,第一个跑起来的魔术方法其实是 __init__。它不是用来造对象的,但几乎变成了创建完毕后整理房间的环节。比如我写个类:
```pythonclass Person:
def __init__(self, name, age):self.name = nameself.age = age
```
一旦调用 `p = Person("张三", 20)`,就像开启了一个自动流程,__init__ 就把这两个参数填进来,把实例的属性装备好。
这里要特别强调,self 必须得写在第一位。虽然你可以用别的名字,但大家都这么用,这是约定俗成的。
可以给参数设置默认值,比如: `def __init__(self, name, age=18):` 那样就不用每次都写年龄啦。
值得提醒的是,这个方法不能有返回值,否则会报错(只能返回 None)。为什么呢?因为创建流程已经在 __new__ 里走完,__init__ 就负责填坑。
还记得一个细节:调用实例时,参数个数和顺序必须对应,参数写多写少都不行(除非用默认值补充上)。
二、__repr__:字符串表示方法含义与作用
我经常疑惑,为啥调试那么麻烦?直到遇到了 __repr__。
它的任务,就是定义对象官方的字符串样子。
配资知识百科知识试想,在交互式命令行下打印一个对象,比如:
```pythonp1 = Person("张三", 20)print(p1)
```
若没有定义 __repr__,会得到一段啥都看不懂的地址信息: `<__main__.Person object at 0x7f8a1b2c3d4e>`。
更自然的,是让它输出一段格式化的内容,比如:
```python
def __repr__(self):return f"Person(name='{self.name}', age={self.age})"
```
这样一看就清楚了。
我查了下资料,是因为 __repr__ 的返回值必须是字符串。这个字符串,要尽量有还原实例的能力(即可以复制粘贴,重新创建实例)。
嘿,差点忘了,__str__ 和 __repr__ 好像有点有关呢。
元股证券:ygzq.hk我自己的理解是:__str__ 给人看的,用于用户视角;而 __repr__ 更官方,用来调试或开发。
若没定义 __str__,Python 会用 __repr__ 代替显示。
三、__eq__:相等比较方法含义与作用
这个魔术方法比较关键。没定义的话,两个对象即使内容一样,也会被认为不同。因为默认用地址比较。
比如:
```pythonclass Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):if not isinstance(other, Person):return False
return self.name == other.name and self.age == other.age```
这样,两个张三、20岁的实例:
```pythonp1 = Person("张三", 20)p2 = Person("张三", 20)
print(p1 == p2) 输出:True```
就按内容比较了。
这里关键,__eq__ 要返回布尔值——真或假。
我试过,没有定义 __eq__,那两个内容一样的实例,比较结果还会是 False。觉得挺麻烦。
__eq__ 只是常用的,还有 __ne__ 不等于、__gt__ 大于啥的。
总结一下:
- __init__:建立实例,初始化属性,相当于建房
- __repr__:实例的官方显示,让调试更方便
- __eq__:定义对象相等的逻辑,符合业务场景
这些魔术方法,合理用起来,能让你的类看起来更人性化,调试起来也不那么费事。
顺便说一句,不确定你会不会觉得麻烦,这手艺其实只是多写点代码,保持惯。一开始总觉得繁琐,但越写越顺手。
(这个话题我们稍后再说——关于你平时写类时,哪个魔术方法用得最多?)
——
我在写这个例子时,翻了几张测试照片,突然发现,有几个点容易被忽略:比如 __repr__ 返回字符串的格式,现在很多库会用到,比如在日志或输出调试信息时。
还有个细节是:定义 __eq__ 后,使用 `==` 比较对象变得像业务判断——内容一致即相等。
也是因为我之前写过几个场景,觉得这三者组合起来,几乎是写好用类的标准配置。
未来的代码,如果有一套规范,怎么定义 __repr__ 和 __eq__,就能起到很好的自我保护作用。
可能还会遇到:如果定义 __eq__,建议配合定义 __hash__(在需要用到哈希的场景),但这又是另一个故事了。
我随便猜测,具体实现还得看实际场景——比如数据库对象、缓存对象、或者只是一段测试代码。
没深入想过,但感觉定义得合理之后,调试和维护的效率会提高不少。
或者你也可以试试,用__slots__来限制实例属性,能不能让 __repr__ 更轻便?这个问题留着聊——下次或许可以试试。
就这样杠杆配资炒股开户流程,这三个魔术方法,还是挺古灵精怪的。合理利用,让Python写出来的类更会说话。

当地时间6月22日杠杆配资炒股开户流程,伦敦唐宁街10号首相府的黑色木门旁,那只名叫拉里的虎斑猫又一次站在了它熟悉的位置
2026-07-26
元股证券:ygzq.hk 热点栏目 自选股 数据中心 行情中心 资金流向 模拟交易 客户端 香港联交所最新资料显示,7月
2026-07-27
泰山财经记者林俊洁杠杆配资炒股金融市场 7月30日,光模块龙头中际旭创在港交所主板上市,当日公司披露了控股股东及一致行动
2026-08-03
网上配资 北京时间6月3日杠杆配资炒股金融市场,国际足球友谊赛,克罗地亚对阵比利时。 元股证券:ygzq.hk \n \
2026-07-21
2026赛季乒超联赛7月23日大连开赛。新规落地:外协球员全面禁入,2025赛季10名外援清零;国内注册球员禁签海外联赛
2026-07-24