ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python---class---__init__方法的学习理解。

2021-03-27 10:33:49  阅读:147  来源: 互联网

标签:__ name python self --- init 实例 scores


转载,参考,总结:https://www.zhihu.com/question/46973549
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

python小白一枚,在学习机器学习过程中,实现模型代码不止一次遇到__init__,每次看到就开始头大,接着就放弃。。。这次终于下定决心研究研究,


提示:以下是本人在知乎上学习各位大佬的回答,综合整理的结果。

基本概念:

1.类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。(类:对象)
2.方法:类中定义的函数
3__init__:在创建类的实例的时候,实例会自动调用这个方法,一般用来对实例的属性进行初始化。

简例:

eg:

def __init__(self,name,scores):
	self.name = name
	self.scores = scores

__init__是一个方法,在此例中,方法的形参有self,name,scores三个:

self:表示对象本身,谁调用,就表示谁。一般类中的方法的第一个参数都是self(也可以换成其他名称)

self.name 中的name是对象的name属性,self.name = name ,意思是将等号后面的变量name 赋值给了self对象的name属性。

具体理解

#创建一个“学生”类
'''
在类名Student后加圆括号(),组成一个类似函数调用的形式Student()。则执行了一个叫做实例化的过程,即根据定义好的规则,创建一个包含具体数据的学生对象(实例)
'''
class Student(): 
    pass

#创建一个“学生”的实例,即一个具体的“学生”对象
stu_1 = Student()
#为了使用创建的学生实例stu_1,我们可以继续为他添加或修改属性,比如创建一组成绩
stu_1.scores = [80,90,85]
print(stu_1.scores)
'''但这样存在很多问题,这样的scores属性是暴露出来的,它的使用完全被外面控制着,没有起到“封装”的效果'''
'''于是我们在执行实例化过程student()时传入一些参数。以方便且正确地初始化/设置一些属性值,那么如何定义这种初始化行为呢》?
在类内部定义一个__init__函数,。。。。
'''
class Student():
    def __init__(self,score1,score2,score3):
        #相关初始化语句

定义__init__后,执行实例化的过程须变成Student(arg1,arg2,arg3),
新建的实例本身,连带其中的参数,会一并传给__init__函数自动并执行它。所以__init__函数的参数列表会在开头多出一项,它永远指代新建的那个实例对象,这个必须有,名称随意,习惯上命名为self,注意:self不用传入

#新建的实例传给self后,就可以在__init__函数内创建并初始化它的属性了,
class Student():
    def __init__(self,score1,score2,score3):
        self.scores = [score1,score2,score3]
#此时,若再要创建拥有具体成绩的学生实例,就只需
stu_1 = Student(80,90,85)
print(stu_1.scores)

在这里插入图片描述
此时,stu_1将已经具有设置好的scores属性,并且由于__init__规定了实例化时的参数,若传入的参数数目不正确,解释器可以报错提醒,也可以在其内部添加必要的参数检查。

__init__有独立的命名空间,也就是说函数内新引入的变量均为局部变量,新建的实例对象对这个函数来说也只是通过第一参数self从外部传入的,故无论设置还是使用它的属性都得利用self.<属性名>。如果将上面初始化语句写成scores = [sore1,score2,score3](少了self.),则只是在函数内部创建了一个scores变量,它在函数执行完就会消失,对新建的实例没有任何影响。

与此对应,self的属性名和函数内其他名称(包括参数)也是不冲突的,所以下面这种写法也正确

class Student():
    def __init__(self,name,scores):
        #这里增加了属性name,并将所有成绩作为一个参数scores传入,
        #self.name是self的属性,单独的name是函数内的局部变量,参数也是局部变量
        self.name = name
        if len(scores) == 3:
            self.scores = scores
        else:
            self.scores = [0]*3
stu_1 = Student('Alice',[80,90,85])
print(stu_1.name)
print(stu_1.scores)

在这里插入图片描述

#继续例子理解
class testClass:
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        print(name.title() + ' is a ' + gender + '.')

testman = testClass("rhif",'male')
print(testman.name)
print(testman.gender)

在这里插入图片描述

总结

以上就是本人刚开始学习理解class中__init__方法的一些基本总结了,具体参考下面知乎链接。
https://www.zhihu.com/question/46973549

标签:__,name,python,self,---,init,实例,scores
来源: https://blog.csdn.net/weixin_51010678/article/details/115260310

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有