python 简单理解常见的魔法方法:init,str,del,mro
魔法方法:方法名前后都有两个下划线,这样的方法称为魔法方法
特点:当需要完成某种操作的时候自动调用的方法
init
1.当对象创建完成后,会自动调用该方法,给对象进行初始化(给对象添加属性)
2.以后关于给对象添加属性的操作统一在该方法里面完成,提高代码的复用性
举例:
class Person(object):
#当Person对象创建完成后会自动调用该方法给对象添加属性
def __init__(self):
self.name='李四'
self.age = 20
def show_info(self):
print(self.name,self.age)
p1 = Person()
p1.show_info()
p2 = Person()
p2.show_info()
注释:1.一个类可以创建多个对象,而这多个对象是不同的对象
2.self只是方法的一个参数,可以修改self的名字,但是一般不修改时默认的,self可以动态获取不同对象身上的属性信息,self表示调用当前方法时的对象,也就是说,哪个对象调用了self,self就是哪个对象
以上案例会导致对象的属性被写死,下面这个案例解决属性值被写死的情况
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def show_info(self):
print(self.name,self.age)
p1 = Person('王五',27)
此处使用位置参数进行传参的,也可以用关键字进行传参,此处不用给self传参,因为在创建对象的时候解释器会自动把创建的对象传给self
p1.show_info()
str
1.当使用print函数输出对象属性的时候会自动调用该方法,以字符串的形式返回对象的属性
2.正常情况下获取对象的属性信息,需要调用类里面的方法,但是现在可以直接使用str魔法方法返回字符串类型的对象属性值
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return '姓名:%s 年龄:%d' % (self.name,self.age)
#会调用init
p1 = Person('王五',27)
print(p1)
del
1.当前对象被销毁的时候自动调用该方法,主要是验证对象是否被销毁
对象销毁的场景1.程序运行结束,程序中所使用到的数据对象会在内存中销毁
2.当内存中的数据对象没有变量使用的时候,该对象也销毁
提示:对象是否销毁是由引用计数来管理的,当引用计数为0时对象销毁
引用计数:对象的内存地址被变量使用的次数
mro
1.用以查看类的继承顺序
2.调用该方法的查找顺序是由类继续顺序来决定的,如果找到了某个方法,就不会在后续的类中查找了
3.会先查找本类,找不到的话再按继承的顺序
class Fish(object):
def show1(self):
print('show1')
class Animal(object):
def show2(self):
print('show2')
class Shark(Fish,Animal):
def show3(self):
print('show3')
p1 = Shark()
p1.show2()
result = Shark.__mro__
print(result)
(<class '__main__.Shark'>, <class '__main__.Fish'>, <class '__main__.Animal'>, <class 'object'>)