Python魔法方法
魔法方法特点:
- 两侧各有连个下划线__
- 名字不能改动,可以重写,会在恰当的时候自动调用。
-
init方法
__init__方法,在创建对象的时候默认被调用。 -
del方法
删除对象时默认调用这个方法。 - str方法
class Cat:
def __init__(self,name,color):
self.name = name
self.color = color
tom = Cat('Tom','white')
# 使用 print 方法打印对象时,会调用对象的 __str__ 方法,默认会打印类名和对象的地址名
print(tom) # <__main__.Cat object at 0x0000021BE3B9C940>
如果想要修改对象的输出的结果,可以重写 str 方法。
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return '哈哈'
p = Person('张三',18)
print(p) # 哈哈 打印对象时,会自动调用对象的 __str__ 方法
-
repr方法
和str方法类似。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def __repr__(self):
return 'helllo'
class Person:
def __repr__(self):
return 'hi'
def __str__(self):
return 'good'
s = Student('lisi', 95)
print(s) # hello
p = Person()
print(p) # good
上面的代码可以看出这两个方法的调用顺序。
-
call方法
对象后面加括号,触发执行。
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__
总结
当创建一个对象时,会自动调用init方法,当删除一个对象时,会自动调用del方法。
使用str和repr方法,都会修改一个对象转换成为字符串的结果。一般来说,str方法的结果更加在意可读性,而repr方法的结果更加在意正确性(例如:datetime模块里的datetime类)