Python类中__init__自动初始化实例属性,__repr__让对象打印更易读,__eq__自定义实例相等比较规则让开发更高效易维护

作者:睿博证券 发布时间:2026-08-07 04:56:55

Python类中__init__自动初始化实例属性,__repr__让对象打印更易读,__eq__自定义实例相等比较规则让开发更高效易维护

一、__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写出来的类更会说话。

上一篇:宁夏新型多功能造雪机助力冰雪产业 下一篇:没有了