Python中的init是什么?
在学习Python时,我们经常会遇到__init__
这个函数。那么,它是什么?有什么作用?在哪些情况下会用到呢?
阅读更多:Python 教程
__init__
函数的作用
__init__
这个函数是Python中特有的一个魔法方法(也叫特殊方法、双下划线方法)。当创建一个对象时,Python会主动调用该方法,用于对这个新的对象进行初始化操作。通俗地说,__init__
函数就是用于初始化对象的函数。
我们可以在__init__
函数中定义对象的属性,使得在对象创建后,这些属性就已经被定义好了。这些属性可以是数字、字符串、列表、元组等各种类型。
下面是一个简单的例子:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('Tom', 20)
print(p1.name)
print(p1.age)
在上述例子中,我们定义了一个Person类,其中__init__
函数用于初始化对象。当我们创建一个Person对象时,我们需要传入两个参数,分别是name
和age
。这两个参数会被用来初始化对象的两个属性self.name
和self.age
。
__init__
函数的使用方法
__init__
函数的参数通常为self以外的参数。在调用类时,除了第一个self参数外,其他参数将传递给__init__
函数。
例如:
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print('汪汪!')
d = Dog('小黄', 2)
print(d.name)
print(d.age)
d.bark()
当我们创建一个Dog对象时,需要传入两个参数,即name
和age
。这两个参数会被__init__
函数使用,并用来初始化对象的两个属性self.name
和self.age
。然后,我们可以通过对象访问这些属性,并调用bark
函数。
__init__
函数的位置
通常情况下,__init__
函数需要放在类的最前面。因为在Python中,类中的代码是从上到下顺序执行的。如果在__init__
函数调用前访问对象的属性,那么Python会报一个AttributeError的错误。
例如:
class Car:
wheels = 4
def drive(self):
print('driving')
def show_wheels(self):
print('wheels:', self.wheels)
def __init__(self):
self.color = 'red'
c = Car()
c.show_wheels()
print(c.color)
在上述例子中,我们创建了一个Car类,并且在类的最后定义了__init__
函数。在__init__
函数中,我们初始化了一个新的属性self.color
。最后,我们创建了一个Car对象c
,并访问了show_wheels
函数和color
属性。
如果我们把__init__
函数放在类的最后,我们将会得到一个AttributeError的错误:
class Car:
wheels = 4
def drive(self):
print('driving')
def show_wheels(self):
print('wheels:', self.wheels)
c = Car()
c.show_wheels()
print(c.color)
在上述例子中,我们把__init__
函数放在了类的最后。因此,当我们访问color
属性时,会得到一个AttributeError的错误,因为此时color
属性还没有被定义。
__init__
函数和__new__
函数的区别
在Python中,__new__
函数和__init__
函数都是用于创建对象的函数,但它们的作用不同。
__new__
函数用于创建一个新的对象实例,并返回这个实例。__init__
函数则用于初始化这个对象的属性。
举个例子:
class Test:
def __new__(cls):
print('__new__ function is called')
instance = super(Test, cls).__new__(cls)
return instance
def __init__(self):
print('__init__ function is called')
self.name = 'test'
t = Test()
print(t.name)
在上述例子中,我们定义了一个Test类,并在其中添加了__new__
函数和__init__
函数。当我们创建一个Test对象时,Python会先调用__new__
函数,用于创建这个对象。随后,Python会调用__init__
函数,用于对这个新的对象进行初始化。最后,Python将新创建的对象返回。
如果我们不定义__new__
函数,则Python会使用默认的__new__
函数。此时,我们只需要在__init__
函数中初始化对象的属性即可。
__init__
函数的继承
当我们定义一个子类时,如果该子类没有定义自己的__init__
函数,则Python会自动使用父类的__init__
函数。如果子类定义了自己的__init__
函数,则需要在其中调用父类的__init__
函数,以完成父类的初始化工作。
举个例子:
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def __init__(self, name, age):
super().__init__(name)
self.age = age
d = Dog('小黄', 2)
print(d.name)
print(d.age)
在上述例子中,我们定义了一个Animal类和一个Dog类。在Animal类中,我们定义了一个__init__
函数,用于初始化对象的name
属性。在Dog类中,我们也定义了一个__init__
函数,用于初始化对象的age
属性。同时,我们通过调用super().__init__(name)
,将父类的__init__
函数也加入到了子类的__init__
函数中,以完成父类的初始化工作。
结论
__init__
函数是Python中用于初始化对象的函数,其作用是在创建对象时对对象进行初始化。在定义__init__
函数时,其参数通常为self以外的参数,在调用类时,除了self参数外,其他参数将传递给__init__
函数。通常情况下,__init__
函数需要放在类的最前面,以便对象的属性能够被正确定义。__init__
函数和__new__
函数都用于创建对象,但其作用不同。继承类中,子类可以继承父类的__init__
函数,也可以定义自己的__init__
函数,并在其中调用父类的__init__
函数。