python中_init_的函数怎么用,python_init_方法的作用和特征
Java网站链接:Java全栈工程师示例驱动学习 how2j.cn
1)class类包含:
类的属性:类中涉及的变量。
类的方法:类中的函数
2) __init函数(方法)
1.开头有两个下划线的函数声明该属性是私有的,不能在类外使用或直接访问。
2.init函数(方法)支持带参数的类的初始化,也可以用来声明类的属性。
3.init函数(方法)的第一个参数必须是self(self是个成语,也可以用其他名字),后面的参数可以自由定义,和定义函数没什么区别。(解释:self,英文单词含义明显,表示自己,本身)。这里有几个潜在的含义:
1.这里的Self指的是实例Instance本身。
2.同时,说到“自我”这个词,是用相对的“他者”来说的。这里的其他变量指的是类和其他变量,比如布局变量和全局变量。自我在这里是一个对象,客体。是当前类的实例。
因此,相应的
自我价值名称
在函数中()
Value:代表self对象的变量,即实例。它对应于其他类变量、全局变量和局部变量。
函数:表示调用的是self对象,也就是实例的函数。它对应于其他全局函数。
Python中为什么要有self?
其实上面已经基本说清楚了为什么需要自我。
那就是:
在类的代码(函数)中,需要访问当前实例中的变量和函数,即访问:
对应的变量(属性):实例。读取以前的值并写入新值。
调用相应的函数):Instance.function(),即执行相应的动作。
-但是你需要访问实例的变量,调用实例的函数,当然也需要对应的实例实例对象本身。
-Python规定函数的第一个参数必须是实例对象本身,建议习惯上将其名称写成self。
——所以,我们需要自我(我们需要利用自我)
如果不使用self,也就是在代码中去掉self之后,那段文字中使用的变量实际上并不是你想要的,不是真实实例中的变量和函数,而是实际访问了其他部分的变量和函数。
甚至因为没有合适的初始化实例变量,会导致后续不可访问的错误。
下面,通过代码,来论证,如果self被移除,或者self没有被合理使用,会出现什么错误。
如果相应的实例变量没有在__init__中初始化,那么对实例变量的后续引用将会导致错误。
下面的代码充分说明了如果在Class class的初始__init__函数中没有正确初始化实例变量,以后就没有变量可用了,就会出现AttributeError的错误:
#注意:这里的全局变量名,写为name,仅用于演示。
#其实好的编程风格应该写成gName这样的名字来表示变量是全局变量。
name=全局名称;
班级人员:
def __init__(self,newPersionName):
# self.name=newPersionName
#1.如果这里没有写为self.name
#那么这里的名字就是__init__函数中的局部临时变量名。
#与全局名称无关。
name=newPersionName
#这里使用的局部变量名称只是为了演示代码,
#但是,应该注意的是,这里很明显,下面的代码没有利用这里的局部变量名。
#导致这里的name变量实际上被浪费了,根本用不到。
def sayYourName(self):
#在这里,因为找不到实例中的name变量,所以将报告一个错误:
#AttributeError:人员实例没有属性“name”
print 我的名字是% s %(self . name);
def selfAndInitDemo():
persion instance=Person( crifan );
persion instance . say your name();
###############################################################################
if __name__==__main__ :
selfAndInitDemo();
从上面的代码可以看出,由于类初始化(实例化)的__init__函数中没有设置self.name的值,所以实例中没有name变量,导致后面访问self.name时出现AttributeError错误。
相应的,如果写成self.name,意思是正确的,就是初始化的时候给实例增加了新的值newPersionName,正常设置了正确的值,这样以后通过self.name就可以访问当前实例中正确的变量名了。
对应的正确编写代码如下:
#注意:这里的全局变量名,写为name,仅用于演示。
#其实好的编程风格应该写成gName这样的名字来表示变量是全局变量。
name=全局名称;
班级人员:
def __init__(self,newPersionName):
#这里正确的是,通过访问self.name的形式,实现了:
#1.将name变量添加到示例中。
#2.初始值被赋给name,即newPersionName。
self.name=newPersionName
def sayYourName(self):
#在这里,由于self对象已经被正确初始化,name变量被包含在其中,所以name值在这里可以被正确访问,输出也可以是正确的:
#我的名字是克里凡
print 我的名字是% s %(self . name);
def selfAndInitDemo():
persion instance=Person( crifan );
persion instance . say your name();
###############################################################################
if __name__==__main__ :
selfAndInitDemo();
在函数中,使用相应的变量。虽然代码可以运行,但实际使用的是它,而不是实例中的变量。
有时候虽然你写的代码可以运行,但是你用的变量,因为self没有加,实际上用的是其他变量而不是实例变量。
这类问题主要与Python中变量的作用域有关,但在这个例子中,也与是否使用self有关:
#注意:这里的全局变量名,写为name,仅用于演示。
#其实好的编程风格应该写成gName这样的名字来表示变量是全局变量。
name=全局名称;
班级人员:
name=类全局名称
def __init__(self,newPersionName):
# self.name=newPersionName
#这里不使用self.name。
#所以这里的名字实际上还是局部变量名。
#虽然在这里赋值了,但是后面没有用到,属于浪费的局部变量名。
name=newPersionName
def sayYourName(self):
#在这里,它没有像以前一样出现的原因是:
#AttributeError:人员实例没有属性“name”
#那是因为,虽然当前实例self中的__init__中没有初始化对应的name变量,但是实例self中没有对应的name变量。
#但是因为实例对应的类Person有对应的name变量,所以也可以正常执行代码。
#这里对应的self.name实际上是Person.name
print 我的名字是% s %(self . name);# -类全局名称
Person类中的“print”名称实际上是全局名称:% s“%(name);#-全局名称
print 仅通过Person.name=%s%(Person.name)访问人员的姓名;# -类全局名称
def selfAndInitDemo():
persion instance=Person( crifan );
persion instance . say your name();
“print”全局名称是%s%(名称);# -全局名称
###############################################################################
if __name__==__main__ :
selfAndInitDemo();
可以看出,这里的start __init__中没有为self实例初始化对应的名称。
在下面的函数sayYourName中,虽然可以调用到self.name,但是没有AttributeError错误。
但实际上这里的值并不是预期的,传入的名字,即 crifan ,而是这个名字在类中的值,即 class global name 。
Python中的__init__。
在Python中,我们经常看到很多类中都有__init__函数。
我们来解释一下__init__的含义。
Python中__init__的含义
先看init这个词本身,意思是初始化。
而__init__,和这个词的本义一样,是用来初始化的。
但是为了谁呢?
很明显,就是初始化对应的类本身。
Python中为什么有__init__?
我的理解是__init__的出现主要有两个作用:
常见的初始化,我理解可能有两个主要方面:
支持用参数初始化类。
这种用法感觉就像,在其他语言中,类初始化时,可以运行并传递不同的参数;
用代码演示如下:
班级人员:
def __init__(self,newPersionName):
#在初始化新类的示例实例时,为相应的不同实例设置不同的人名。
self.name=newPersionName
def sayYourName(self):
#不同人的例子,调用同一个方法时,说出自己的名字,结果都是对应自己的,不同的名字。
print 我的名字是% s %(self . name);#我的名字是克里凡
def initDemo():
persion instance=Person( crifan );
persion instance . say your name();
###############################################################################
if __name__==__main__ :
init demo();
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。