Python类中self和__init__()介绍【修改】
Python中使用class,总会看见self和__init__()。那么它们有什么作用呢?
【面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板——类中定义了某一种类型对象所应具有的共同的属性、方法——由类可创建类的实例。对象和实例是一样的意思。关于这些在此不多说了,可参见https://blog.csdn.net/cnds123/article/details/108354860 】
在Python中,self表示类的实例本身,通过self参数,你可以将类的属性和方法与特定对象关联起来。
在 Python 中,self 是一个指向实例对象自身的引用,可以在类的方法中使用它来访问实例属性和调用实例方法。Python 类中定义的实例方法,都需要使用 self 参数来引用实例本身,self 是一个约定俗成的名称【self 不是关键字,可以使用任意名称来表示该参数,但是为了遵循惯例和提高代码可读性】,在类内部定义方法时必须加上这个参数,用于表示当前对象自身;在调用实例方法时不需要手动传递 self 参数,Python 会自动将该实例作为第一个参数传递给该方法。
例如
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("Hello, my name is", self.name, "and I am", self.age, "years old.")
p1 = Person("Alice", 25)
p1.say_hello() # 输出 "Hello, my name is Alice and I am 25 years old."
上面的示例中,我们首先定义了一个 Person 类,并在该类中定义了 __init__() 方法和 say_hello() 方法。__init__() 方法用于初始化新建的对象,而 say_hello() 方法用于输出对象的属性信息。
接着,我们使用 Person("Alice", 25) 的语法来创建一个名为 p1 的 Person 类对象,并将参数 "Alice" 和 25 分别传递给 __init__() 方法进行对象的初始化操作。最后,我们通过 p1.say_hello() 的语法来调用 say_hello() 方法,并在方法内部使用 self.name 和 self.age 来引用该对象的属性,从而输出了对象的属性信息。并且,在调用实例方法时不需要手动传递 self 参数。
Python 中实例化类的语法是通过 类名([参数列表]) 来实现的。在 Python 中,实例化类的语法如下:
对象名 = 类名([参数列表])
其中,对象名 是要创建的对象的名称,类名 是要实例化的类的名称,参数列表 是传递给 __init__() 方法的参数列表—— 是用于传递给类的 __init__()
方法 的实参列表。。
例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("Alice", 25)
print(p1.name) # 输出 "Alice"
print(p1.age) # 输出 25
上面的示例中,我们首先定义了一个 Person 类,并在该类中定义了 __init__() 方法,用于初始化新建的对象。接着,我们使用 Person("Alice", 25) 的语法来创建一个名为 p1 的 Person 类对象,并将参数 "Alice" 和 25 分别传递给 __init__() 方法进行对象的初始化操作。最后,我们分别输出了 p1 对象的 name 和 age 属性。
在 Python 中,实例化类时可以不传递任何参数,此时 __init__() 方法中的参数列表为空。例如
class MyClass:
def __init__(self):
print("这是一个不带参数的 __init__ 方法。")
obj = MyClass() # 不带参数实例化
上面的示例中,我们定义了一个名为 MyClass 的类,并在该类中定义了一个不带参数的 __init__() 方法。接着,我们使用 MyClass() 的语法来创建一个名为 obj 的 MyClass 类对象,并自动调用了 __init__() 方法进行对象的初始化操作。
在Python中定义类经常会用到__init__()方法,类的初始化方法【注:相当于其它语言的构造函数,故也称为构造方法】,在创建类时,我们可以手动添加一个 __init__() 方法,即便不手动为类添加__init__方法,Python解释器也会以默认方式隐式地为类建立一个仅包含 self 参数的构造方法,称为类的默认构造方法。
当你创建一个类的实例时,Python会自动调用该类的__init__()方法,并将该对象作为第一个参数传递给它。
在__init__()方法中,你可以设定对象的属性和执行一些必要的操作以使对象正确地初始化。通常情况下,在类中定义成员变量时,都会在__init__()方法中初始化这些属性值。
__init__方法在对象创建时自动调用,无需手动显式调用。
特别提醒,在Python中还有另一种特殊方法__new__(),它负责创建对象并返回一个对象的引用。new()方法通常不需要手动实现,因为Python会自动调用它来创建对象。init()方法则负责初始化对象的状态。而new()方法通常用于实现自定义的对象创建逻辑,并且返回一个新的实例对象。
以下是一个简单示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("Hello, my name is " + self.name)
p = Person("Tom", 25)
p.say_hello() # output: Hello, my name is Tom
在上面的例子中,我们定义了一个Person类,并在__init__()方法中初始化了类的两个属性:name和age。然后我们定义了一个say_hello()方法,并在其中使用self参数来访问name属性。最后,我们创建了一个Person对象并调用say_hello()方法。
在上面的例子中,self.name 和作为参数的 name 是两个不同的变量。 self.name是实例变量, name 是一个局部变量。
在该类中的 say_hello() 方法中,我们使用 self.name 来访问实例变量 name 的值,以形成打印输出。由于 self.name 是一个实例变量,它可以在整个类中的任何方法中使用,而不仅仅是在 __init__() 方法中。
self.name中的 name作为实例变量名 和 作为参数的变量名name 是两个不同的变量,它们具有不同的生命周期和范围。因此self.name 中的作为实例的变量名 name和 作为参数的变量名name不需要一样。 self.name中的 name 可以是任何合法的标识符,比如 self.my_name。上面例子可改写为:
class Person:
def __init__(self, name, age):
self.my_name = name
self.my_age = age
def say_hello(self):
print("Hello, my name is " + self.my_name)
p = Person("Tom", 25)
p.say_hello() # output: Hello, my name is Tom
在Python中,一个类只能有一个__init__()方法。这个方法是在实例化一个对象时自动调用的构造函数,用于初始化新创建的对象。如果在一个类中定义了多个__init__()方法,那么最后定义的那个方法会覆盖之前的方法定义。因此,如果想要重载__init__()方法来支持不同的参数列表,应该使用默认参数值或者使用其他方法名来实现。下面是两种实现方式的示例代码:
1.使用默认参数值
class Person:
def __init__(self, name='', age=0):
self.name = name
self.age = age
person1 = Person()
person2 = Person('Alice')
person3 = Person('Bob', 30)
print(person1.name, person1.age) # '', 0
print(person2.name, person2.age) # 'Alice', 0
print(person3.name, person3.age) # 'Bob', 30
在上面的代码中,我们定义了一个Person类,并在__init__()方法中使用了默认参数值来支持不同的参数列表。当我们创建一个Person对象时,可以传递一个或两个参数,如果只传递一个参数,则另一个参数会使用默认值。
2.使用其他方法名
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def init_with_name(self, name):
self.name = name
def init_with_age(self, age):
self.age = age
在上面的代码中,我们定义了一个Person类,并使用了两个新的初始化方法:init_with_name()和init_with_age()。这些方法接受单独的参数并用于设置对象的属性。虽然这些方法不能像__init__()方法一样自动调用,但它们提供了一种灵活的方式来初始化对象,并且可以根据需要选择使用哪个方法。
小结
self在定义时需要定义,但是在调用时会自动传入。
在python中self不是关键字,self的名字并不是规定死的,但是最好还是按照约定是用self。
self总是指调用时的类的实例。
__init__()方法(函数)又被称为构造器(constructor)或构造函数,用__init__()这个特殊的方法(函数)可以方便地自己对类的属性进行定义。
成员函数需要被手动调用,而构造函数在创建对象的过程中是自动被调用的。
__init__方法在对象创建时自动调用,无需手动显式调用。
self.变量名=变量名,self.变量名 中的变量名(实例变量名) 和作为参数的 变量名 是两个不同的变量,两者标识符通常相同,但不必如此。
附录
__init__()官网的说法可见https://docs.python.org/zh-cn/3/reference/datamodel.html?highlight=object%20__new__#object.__init__
__init__是一个初始化方法,负责对__new__实例化的对象进行初始化,不能返回非none值。
对象是由 __new__() 和 __init__() 协作构造完成的 (由 __new__() 创建,并由 __init__() 定制)。
【许多人将 __init__() 方法称为构造方法,从官方文档看,但严格来说,__init__() 方法并不是 Python 中真正意义上的构造函数,称为初始化方法更恰当。】