zoukankan      html  css  js  c++  java
  • 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来判断是哪个对象调用了实例方法
  • 相关阅读:
    Linux学习 :字符设备框架
    Linux学习 :Uboot, Kernel, 根文件系统初步分析
    Linux学习 : 裸板调试 之 配置UART
    Linux学习 : 裸板调试 之 配置使用NAND FLASH
    Linux学习 : 裸板调试 之 使用MMU
    Linux I2C总线控制器驱动(S3C2440)
    Linux I2C总线设备驱动模型分析(ov7740)
    Linux摄像头驱动学习之:(六)UVC-基本框架代码分析
    【Java】 剑指offer(25) 合并两个排序的链表
    【Java】 剑指offer(24) 反转链表
  • 原文地址:https://www.cnblogs.com/dong4716138/p/15722356.html
Copyright © 2011-2022 走看看