1,_ _ init _ _() 方法
(1)python的类里提供的,两个下划线开始,两个下划线结束的方法就是魔法方法,_ _ into _ () 方法就是一个魔法方法,通常用来执行属性初始化或赋值操作。
(2)一个类里面,无论自己是否编写 _ into _ () 方法,类里面一定会有一个 _ into _ () 方法;如果类没有写 _ into _ () 方法,python会自动创建,但是不执行任何操作。如果有自己想要的功能,那就自己定义 _ into _ _() 方法就可以。
class Enemy(object):
def __init__(self):
self.name = '珊珊'
self.hp = 999 # 生命值
self.attack = 888 # 攻击力
self.DEF = 3999 # 防御力
def get_attack(self):
print("敌人受到攻击!")
def set_attack(self):
print("敌人开始攻击!")
def print_info(self):
print("敌人 %s 的生命值 : %d" % (self.name , self.hp))
print("敌人 %s 攻击力 : %d" % (self.name , self.attack))
print("敌人 %s 防御力 : %d" % (self.name , self.DEF))
# 实例化一个对象,并自动调用__init__()方法
thanos = Enemy()
# 获取对象的实例方法
thanos.print_info()
thanos.set_attack()
thanos.get_attack()
显示结果:
注意:
- _ _ init _ _() 方法在创建一个对象的时候默认被调用,不需要手动调用。
- _ _ init _ _(self)中的self参数不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
2,有参数的 _ _ init _ _() 方法
_ _ init _ _(self,x,y)默认一个参数名字为self,如果创建对象的时候传递了多个实参,那么在定义的时候,除了第一个形参self,还需要定义对应的形参。
class Enemy(object):
def __init__(self, name, skill, hp, attack, DEF):
# 姓名
self.name = name
# 技能
self.skill = skill
# 生命值
self.hp = hp
# 攻击力
self.attack = attack
# 防御力
self.DEF = DEF
def set_attack(self):
print("敌人开始攻击!")
def get_attack(self):
print("敌人受到攻击!")
def print_info(self):
print("敌人 %s 的生命值 : %d" % (self.name , self.hp))
print("敌人 %s 攻击力 : %d" % (self.name , self.attack))
print("敌人 %s 防御力 : %d" % (self.name , self.DEF))
print("敌人 %s 技能 : %s" % (self.name , self.skill))
# 实例化一个对象,并自动调用__init__()方法
thanos = Enemy('珊珊','打怪',999,888,19999)
anglim = Enemy('豆豆','躲猫猫',777,333,39999)
# 获取对象的实例方法
thanos.print_info()
anglim.print_info()
# 不同对象的相同属性单独保存
print(id(thanos.skill))
print(id(anglim.skill))
# 同一个类的不同对象,实例方法共享
print(id(thanos.get_attack()))
print(id(anglim.get_attack()))
显示结果:
注意:
- 在类内部获取属性和实例的方法,通过self获取。
- 在类外部获取属性和实例的方法,通过对象名获取。
- 如果一个类有多个对象,那么每个对象的属性是各自保存的,且有自己独立的内存地址id。
- 实例方法是所有对象共享的,只是占用一份内存空间。类会通过self来判断调用实例方法的对象。
3,_ _ str _ _() 方法
(1)_ _ str _ () 方法通常返回一个字符串作为这个对象的描述信息
(2)使用python输出对象的时候,默认打印的是对象的内存地址,如果定义了 _ str _ _(self) 方法,那么就会打印调用这个方法返回的数据。
class Enemy(object):
def __init__(self, name, skill, hp, attack, DEF):
# 姓名
self.name = name
# 技能
self.skill = skill
# 生命值
self.hp = hp
# 攻击力
self.attack = attack
# 防御力
self.DEF = DEF
def set_attack(self):
print("敌人开始攻击!")
def get_attack(self):
print("敌人受到攻击!")
def print_info(self):
print("敌人 %s 的生命值 : %d" % (self.name , self.hp))
print("敌人 %s 攻击力 : %d" % (self.name , self.attack))
print("敌人 %s 防御力 : %d" % (self.name , self.DEF))
print("敌人 %s 技能 : %s" % (self.name , self.skill))
def __str__(self):
return "敌人【%s】:生命值 %d,攻击力 %d,防御力 %d ,技能 %s" % (self.name,self.hp,self.attack,self.DEF,self.skill)
# 实例化一个对象,并自动调用__init__()方法
thanos = Enemy('珊珊','打怪',999,888,19999)
anglim = Enemy('豆豆','躲猫猫',777,333,39999)
# 获取对象的实例方法
print(thanos)
print(anglim)
# 查看类的文档说明,也就是类的注释
print(Enemy.__doc__)
显示结果:
4,_ _ del _ _() 方法
(1)_ _ del _ _() 方法是记录对象删除信息。
(2)当有变量保存了一个对象的引用是,此对象的引用计数会加1。
(3)当使用del()函数删除变量指向的对象是,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,对象才会被真正的删除。
class Enemy(object):
def __init__(self,name):
print("---------------程序开始执行---------------------")
print("---------------调用__init__()方法---------------------")
self.name = name
def __del__(self):
print("------__del__()方法自动调用")
print("%s 被干掉了 " %self.name)
# 创建实例化对象
thanos = Enemy('珊珊')
# 删除对象
print("%d 被删除 " % id(thanos))
del(thanos)
print("*" * 30)
thanos = Enemy('珊珊')
thanos1 = thanos
thanos2 = thanos
print("%d 被删除 " % id(thanos))
del(thanos)
print("%d 被删除 " % id(thanos1))
del(thanos1)
print("%d 被删除 " % id(thanos2))
del(thanos2)
显示结果: