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
来判断是哪个对象调用了实例方法