【循序渐进学Python】面向对象知多少——魔方方法
据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切。
他们是可以给你的类增加魔力的特殊方法,如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。
Python 的魔术方法非常强大,然而随之而来的则是责任。了解正确的方法去使用非常重要!
魔方方法
定义:
- 以两个下划线开头并且以两个下划线结束的方法叫做魔法方法
魔方方法的特点:
-
他们都会有一些特殊的功能
-
方法可以自动被调用
魔方方法的来源:
魔方方法一般情况下都是系统提供的方法,Python中的object对象的方法
-
如果想使用魔方方法必须要继承object
-
魔方方法会在特殊的情况下被Python调用
init(self)魔法方法
作用:
- 监听对象的实例过程
使用场景:
- 之前的类成员添加时,属性无法在类里面创建,使用 init(self)魔法方法可以在init(self)魔法方法中进行添加类的必要属性
注意:
- 自定义类中没有声明init(self)魔法方法,但是在新式类中默认使每个自定义类都继承了object类,因此所有的自定义类都具有init(self)魔法方法
- 如果为了能够完成自己想要的功能,可以自己定义init(self)魔法方法
- 如果当需要一个对象在诞生的时候就拥有某个功能,那么可以在init(self)魔法方法中实现
- 如果一个类需要统一的属性的时候,可以在init(self)魔法方法中为每个对象实现这些属性
参数:
- 无参的init(self)魔法方法用于:这个类实例的所有对象具有相同的属性值
- 有参的init(self)魔法方法用于:这个类实例的每个对象都必须要自己提供的属性值的时候
实例:
class Person1(object):
def __init__(self, name, age):
self.name = name
self.age = age
self.info()
def info(self):
print(f"我的名字叫{self.name},今年{self.age}岁")
zs = Person1("张三", 20)
li = Person1("李四", 25)
str(self)魔法方法
作用:
- 追踪对象的属性值的变化的
使用场景:
- 当使用print输出对象的时候,只要定义了str(self)魔法方法,那么就会打印这个方法中return的数据
- str(self)魔法方法需要返回一个字符串,当做这个对象的描写
注意:
- str方法必须有一个返回值,返回值必须为字符串类型
- 默认情况下创建的对象返回的是一些对象的说明及对象所在位置的16进制的一个地址
- 如果一个类里面实现了str(self)魔法方法,那么创建的对象返回的就是这个方法所返回的字符串
参数:
- str方法不能再添加任何参数
实例:
class Person2(object):
def __init__(self):
self.name = "王五"
self.age = 56
def __str__(self):
return "hello world"
ww = Person2()
# 原本情况下ww接收到的是一个类的所在地的引用,使用了__str__(self)魔法方法之后
# ww接收到的是一个__str__(self)魔法方法返回的字符串的引用,
# 但是并非指的是将原来的类所在的引用替换了
print(ww)
print(id(ww))
del(self)魔法方法
作用:
- 监听对象被销毁的事情
使用场景:
- 创建对象后Python解释器默认会调用init(self)魔法方法
- 当每个对象被删除的时候,Python解释器也会默认调用一个方法,就是del(self)魔法方法
注意:
- 当这个对象的地址引用计数为0的时候才会被python给删除的,才会执行这个del方法
- 因此,如果一个数据或者对象在程序中没有任何引用的时候才会被系统释放
参数:
- del(self)魔法方法不能再添加任何参数
实例:
class Person3(object):
def __init__(self):
self.name = "刘六"
def __del__(self):
print("byby")
ll = Person3()