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()

  

 

通过上述的代码,我们发现想要让对象拥有nameage属性,就必须要调用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解释器会自动把当前的对象引用传递过去

image-20200912134918862

四、案例

案例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)

注意:

  1. 在类内部获取 属性 和 实例方法,通过self获取
  2. 在类外部获取 属性 和 实例方法,通过对象名获取

  3. 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址

  4. 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法
原文地址:https://www.cnblogs.com/dong4716138/p/15722356.html