Python面向对象-6.init方法
__init__方法
一、引入
回顾上一节学习self时代码,如下
class Cat(object):
def set_info(self, new_name, new_age):
self.name = new_name
self.age = new_age
def eat(self):
print("%s在吃鱼...." % self.name)
def drink(self):
print("%s在喝可乐..." % self.name)
def introduce(self):
print("名字是:%s, 年龄是:%d" % (self.name, self.age))
# 创建对象tom
tom = Cat()
# 调用方法,设置属性
tom.set_info("汤姆猫", 30)
# 调用实例方法
tom.eat()
tom.drink()
tom.introduce()
# 创建对象jia_fei
jia_fei = Cat()
# 调用方法,设置属性
jia_fei.set_info("加菲猫", 18)
# 调用实例方法
jia_fei.eat()
jia_fei.drink()
jia_fei.introduce()
通过上述的代码,我们发现想要让对象拥有name、age属性,就必须要调用set_info方法,那是否可以更加单点呢?毕竟我们知道定义变量时,可以顺便给它默认值;那创建对象时能否让它默认执行某个方法完成属性的设置呢?
答:可以
二、__init__方法
创建对象后,Python会自动调用一个特殊的方法名字叫__init__,一般情况下我们会在这个方法中完成对象属性的设置
定义示例如下
class 类名(object):
def __init__(self):
pass
注意,__init__方法会在对象创建完毕后,自动调用,无需我们自己调用
class Cat(object):
def __init__(self):
print("我是__init__方法")
cat = Cat() # 此时就会自动调用
三、创建对象的过程
注意,一般情况下我们会在这个方法中完成对象属性的设置,示例如下
class Cat(object):
def __init__(self, new_name, new_age):
self.name = new_name
self.age = new_age
def eat(self):
print("%s在吃鱼...." % self.name)
def drink(self):
print("%s在喝可乐..." % self.name)
def introduce(self):
print("名字是:%s, 年龄是:%d" % (self.name, self.age))
# 创建对象tom
tom = Cat("汤姆猫", 30)
# 调用实例方法
tom.eat()
tom.drink()
tom.introduce()
说明
__init__()方法,在创建一个对象时默认被调用,不需要手动调用__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去

四、案例
案例1:
class Hero(object):
"""定义了一个英雄类,可以移动和攻击"""
def __init__(self, new_name, new_hp, new_atk, new_armor):
self.name = new_name # 姓名
self.hp = new_hp # 生命值
self.atk = new_atk # 攻击力
self.armor = new_armor # 护甲值
def move(self):
print("正在前往事发地点...")
def attack(self):
print("发出了一招强力的普通攻击...")
# 实例化了一个英雄对象,并自动调用__init__()方法
taidamier = Hero("程咬金", 1900, 900, 800)
# 通过.成员选择运算符,获取对象的实例方法
taidamier.info() # 只需要调用实例方法info(),即可获取英雄的属性
taidamier.move()
taidamier.attack()
案例2:
class Hero(object):
"""定义了一个英雄类,可以移动和攻击"""
def __init__(self, new_name, new_skill, new_hp, new_atk, new_armor):
self.name = new_name
self.skill = new_skill
self.hp = new_hp
self.atk = new_atk
self.armor = new_armor
def move(self):
"""实例方法"""
print("%s 正在前往事发地点..." % self.name)
def attack(self):
"""实例方法"""
print("发出了一招强力的%s..." % self.skill)
def info(self):
print("英雄 %s 的生命值 :%d" % (self.name, self.hp))
print("英雄 %s 的攻击力 :%d" % (self.name, self.atk))
print("英雄 %s 的护甲值 :%d" % (self.name, self.armor))
# 实例化英雄对象时,参数会传递到对象的__init__()方法里
taidamier = Hero("泰达米尔", "旋风斩", 2600, 450, 200)
gailun = Hero("盖伦", "大宝剑", 4200, 260, 400)
# 调用对象方法
taidamier.attack()
taidamier.move()
gailun.move()
说明:
-
通过一个类,可以创建多个对象,就好比 通过一个模具创建多个实体一样
-
__init__(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)
注意:
- 在类内部获取 属性 和 实例方法,通过
self获取 -
在类外部获取 属性 和 实例方法,通过对象名获取
-
如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址
- 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过
self来判断是哪个对象调用了实例方法

浙公网安备 33010602011771号