Python系列:面向对象“类”之init方法

举报
数据分析与统计学之美 发表于 2021/09/27 21:51:35 2021/09/27
【摘要】 python系列第十七课

今天就带着大家开始我们——Python学习的第二课,Python基础之面向对象(2)。
image.png
前面,已经对类和对象有一个简单的了解。今天就带着大家讲述一下“类的初始化之init函数”,这很多人一直都难以理解,好好看看吧!

在这里插入图片描述

1. __init(self)__函数

仔细观察这个函数的构造,下面来絮叨絮叨:

  • ① init函数前后各有2个下划线,记住:是2个下划线;
  • ② 初始化函数init,在创建对象的时,就"自动调用"。每创建一次新的对象,就会重新自动调用一次;
  • ③ 小括号中,经常会有一个self,这个后面在讲述;

先简单看一个例子:

class Person:
    def __init__(self):
        print("执行")
    def walk(self):    
        print("走路")
    def run(self):
        print("跑步")

p = Person() 

结果如下:
在这里插入图片描述

1.1 什么是self ?

根据惯例:类中定义的方法,第一个参数是固定的,我们命名为"self"。

再次观察下面这个类:

class Person:
    def __init__(self):
        print("执行")
    def walk(self):    
        print("走路")
    def run(self):
        print("跑步")

p = Person() 
p.walk()
p.run()

这里我们需要讲述3点:

  • ① self表示所创建的当前对象,p = Person() 中,self指的就是当前对象p;
  • ② 类中的每一个方法,括号中都有一个self,仔细观察。
  • ③ p.walk()和p.run()中,其实self是隐式传递的,无需我们主动传递,主动传递还会出错。
  • ④ p.walk()相当于我们把p传进来了,p.run§,但是我们不能这么写;

在这里插入图片描述

1.2 在__init(self)__方法中,增加属性

这个知识其实知识不太难,只是太抽象,大家不好理解。大家一定要好好理解。

  • 创建的实例化对象p、类中的self,其实是一个东西;
  • 但是,类中只能写成self,这是规定;

既然self指的是当前对象p,而__init()__方法在创建对象的时候“自动调用”,那么在__init(self)__方法中,增加属性,就显得很方便了,我们看一个例子:

class Person:
    def __init__(self): # self指的就是当前创建的对象,也就是下面那个p。
        self.name = "张三"
        self.age = 10
    def run(self):
        print("跑步")

p = Person()

这里的self.name = "张三"看着眼熟吗?是不是和之前讲述的p.name = "张三"一摸一样?这是必须的,因为self就是当前对象p。但是这是写在类中的代码,都默认写成self。

1.3 上述增加属性的“弊端”

上述在init方法中,我们增加了一个name属性,一个age属性。但是可以发现:当我们创建不同的对象p、p1、p2…他们的名字name和年龄age都是千篇一律的,这肯定是不合理的。
在这里插入图片描述

1.4 通过传入参数的形式,进行灵活的控制

为了避免创建千篇一律的对象,在定义init方法时,可以为该方法提供一些参数,来更加灵活的进行初始化。

直接通过案例讲解:

class Person:
    def __init__(self,name,age): # self指的就是当前创建的对象
        self.name = name
        self.age = age
    def run(self):
        print("跑步")

上述类,我们不仅有一个self参数,还传递了name、age参数。
在这里插入图片描述

特别注意:

self在实例化对象的时候,是隐式传递的,我们不用管,但是其余参数必须显示地给出。

# 下面,我们连续创建了3个对象,分别是p、p1、p2。
# 也可以看出 :不同对象具有不同的姓名和年纪
p = Person("张三",22)
p1 = Person("李四",25)
p2 = Person("王五",27)

此时,我们调用name和age属性:
在这里插入图片描述

2. 动态的增加属性和方法

这里只是为了说明动态增加“属性和方法”的可能性,实际操作中并不会这样做。实际操作中,“属性”我们直接在init方法中定义,“方法”也是直接在定义类的时候写好。

  • 动态增加的属性和方法,只对当前创建的对象有效。

这里在定义一个类:

class Dog:
    def __init__(self,name):
        self.name = name
        
    def walk(self):
        # 这里的sel.name不理解,先跳过  
        print(f"{self.name}狗:会跳高")

上述类中有一个name属性,一个walk()方法。

2.1 动态增加属性

动态增加一个age属性。
在这里插入图片描述

2.2 动态增加方法

动态增加方法,看起来很复杂,大家了解即可。

def run(self):
    print("动态增加的方法")

dog1.run = run
dog1.run(dog1)

结果如下:
在这里插入图片描述
上述例子大家看起来可能一脸懵逼,做个说明:

  • 注意1 : 第一,定义我们想要增加的方法,记住一定要向其中传入self参数。
  • 注意2 : 第二,p.run = run 把“ 对象的walk方法 ”和“ 定义的run方法 ”绑定起来。
  • 注意3 : 第三,调用动态增加的方法,必须向其中传入对象(下面例子传入的是对象p)。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。