1. init:初始化实例
作用:创建实例时自动调用,用于初始化对象的属性。
注意:它不是构造函数(真正创建对象的是 new),而是初始化已创建的对象。
python
class Person:
# 初始化方法:接收参数并赋值给实例属性
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age
# 创建实例时,参数会传给 __init__
p = Person("张三", 25)
print(p.name) # 输出:张三
print(p.age) # 输出:25
2. str:实例的字符串表示(面向用户)
作用:当用 print() 打印实例,或用 str() 转换实例时,会自动调用该方法。
目标:返回一个 "用户友好" 的字符串,方便人类阅读。
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 定义实例的字符串表示
def __str__(self):
return f"Person(name='{self.name}', age={self.age})"
p = Person("张三", 25)
print(p) # 输出:Person(name='张三', age=25)(自动调用 __str__)
print(str(p)) # 输出:同上(手动调用 str() 触发)
如果不定义 __str__
,默认会返回类似 <__main__.Person object at 0x000001>
的内存地址。
3. repr:实例的字符串表示(面向开发者)
作用:当在交互式环境中直接输入实例,或用 repr() 转换时,会自动调用。
目标:返回一个 "开发者友好" 的字符串,通常能完整描述对象的构造信息(最好能通过 eval() 重建对象)。
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 面向开发者的字符串表示
def __repr__(self):
return f"Person('{self.name}', {self.age})" # 可以直接用于创建对象
p = Person("张三", 25)
p # 交互式环境中输出:Person('张三', 25)(自动调用 __repr__)
print(repr(p)) # 输出:同上(手动调用 repr() 触发)
4. call:让实例可被调用
作用:定义该方法后,实例可以像函数一样被调用(用 () 触发)。
用途:让对象具备函数的行为,常用于实现 "可调用对象"。
python
class Calculator:
def __init__(self, base):
self.base = base # 基础值
# 定义实例被调用时的行为
def __call__(self, x):
return self.base + x # 每次调用时,返回基础值 + 参数
# 创建实例
calc = Calculator(10)
# 实例像函数一样被调用(触发 __call__)
print(calc(5)) # 输出:15(10 + 5)
print(calc(20)) # 输出:30(10 + 20)
这相当于把实例变成了一个 "带状态的函数",比普通函数更灵活。
方法 | 触发时机 | 核心作用 |
---|---|---|
__init__ |
创建实例时 | 初始化实例属性 |
__str__ |
print(实例) 或 str(实例) |
返回用户友好的字符串 |
__repr__ |
直接输入实例或 repr(实例) |
返回开发者友好的字符串(可重现) |
__call__ |
实例被当作函数调用(实例() ) |
让实例具备函数的调用行为 |