Python类中self和__init__()介绍

Python类中self和__init__()介绍

Python中使用class,总会看见self和__init__()。那么它们有什么作用呢?

在Python类(class)包含:

类的属性(attribute):类中所涉及的变量 ;

类的方法(method):类中函数(function);在在Python类的方法中,第一个参数约定写为self,但不必非写成self,代表类的实例(instance)本身,并且调用时不用传递该参数

我们先明确几个问题:

什么是类(class),什么是实例(instance),什么是对象(object)?什么是方法(method)?

面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板——类中定义了某一种类型对象所应具有的共同的属性、方法——由类可创建类的实例。对象和实例是一样的意思。关于这些在此不多说了,可参见https://blog.csdn.net/cnds123/article/details/108354860 

在Python中,self表示类的实例本身,self是一个约定俗成的名称。在python中self不是关键字。

通过self参数,你可以将类的属性和方法与特定对象关联起来。

在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__() 定制)。


进一步学习了解
self in Python class https://www.geeksforgeeks.org/self-in-python-class/
大家是如何理解Python中的self?https://www.zhihu.com/question/39264541
python中__init__方法知识点详解https://www.jb51.net/article/281808.htm
Python中 __init__函数以及参数self怎么理解和使用?https://zhuanlan.zhihu.com/p/439932578

猜你喜欢

转载自blog.csdn.net/cnds123/article/details/130506922