对于在类体中定义的实例方法,Python 会自动绑定方法的第一个参数(通常建议将该参数命名为 self),第一个参数总是指向调用该方法的对象。根据第一个参数出现位置的不同,第一个参数所绑定的对象略有区别:
在构造方法中引用该构造方法正在初始化的对象。
在普通实例方法中引用调用该方法的对象。
由于实例方法(包括构造方法)的第一个 self 参数会自动绑定,因此程序在调用普通实例方法、构造方法时不需要为第一个参数传值。
self 参数(自动绑定的第一个参数)作用就是引用当前方法的调用者,比如前面介绍的在构造方法中通过 self 为该对象增加实例变量。也可以在一个实例方法中访问该类的另一个实例方法或变量。假设定义了一个 Dog 类,这个 Dog 对象的 run() 方法需要调用它的 jump() 方法,此时就可通过 self 参数作为 jump() 方法的调用者。
方法的第一个参数所代表的对象是不确定的,但它的类型是确定的,即它所代表的只能是当前类的实例;只有当这个方法被调用时,它所代表的对象才被确定下来谁在调用这个方法,方法的第一个参数就代表谁。
例如定义如下 Dog 类:
class Dog: # 定义一个jump()方法 def jump(self): print("正在执行jump方法") # 定义一个run()方法,run()方法需要借助jump()方法 def run(self): # 使用self参数引用调用run()方法的对象 self.jump() print("正在执行run方法")
上面代码的 run() 方法中的 self 代表该方法的调用者:谁在调用 run() 方法,那么 self 就代表谁。因此该方法表示:当一个 Dog 对象调用 run() 方法时,run() 方法需要依赖它自己的 jump() 方法。
当 Python 对象的一个方法调用另一个方法时,不可以省略 self。也就是说,将上面的 run()方法改为如下形式是不正确的:
# 定义一个run()方法,run()方法需要借助jump()方法 def run(): #省略self,下面代码会报错 self.jump() print("正在执行run方法")
此外,在构造方法中,self 参数(第一个参数)代表该构造方法正在初始化的对象。例如如下代码:
class InConstructor : def __init__(self) : # 在构造方法里定义一个foo变量(局部变量) foo = 0 # 使用self代表该构造方法正在初始化的对象 # 下面的代码将会把该构造方法正在初始化的对象的foo实例变量设为6 self.foo = 6 # 所有使用InConstructor创建的对象的foo实例变量将被设为6 print(InConstructor().foo) # 输出6
在 InConstructor 的构造方法中,self 参数总是引用该构造方法正在初始化的对象。程序中将正在执行初始化的 InConstructor 对象的 foo 实例变量设为 6,这意味着该构造方法返回的所有对象的 foo 实例变量都等于 6。
需要说明的是,自动绑定的 self 参数并不依赖具体的调用方式,不管是以方法调用还是以函数调用的方式执行它,self 参数一样可以自动绑定。例如如下程序:
class User: def test(self): print('self参数: ', self) u = User() # 以方法形式调用test()方法 u.test() # <__main__.User object at 0x00000000021F8240> # 将User对象的test方法赋值给foo变量 foo = u.test # 通过foo变量(函数形式)调用test()方法。 foo() # <__main__.User object at 0x00000000021F8240>
上面程序中第 5 行代码以方法形式调用 User 对象的 test() 方法,此时方法调用者当然会自动绑定到方法的第一个参数(self 参数);程序中第 11 行代码以函数形式调用 User 对象的 test() 方法,看上去此时没有调用者了,但程序依然会把实际调用者绑定到方法的第一个参数,因此输出结果完全相同。
当 self 参数作为对象的默认引用时,程序可以像访问普通变量一样来访问这个 self 参数,甚至可以把 self 参数当成实例方法的返回值。看下面程序:
class ReturnSelf : def grow(self): if hasattr(self, 'age'): self.age += 1 else: self.age = 1 # return self返回调用该方法的对象 return self rs = ReturnSelf() # 可以连续调用同一个方法 rs.grow().grow().grow() print("rs的age属性值是:", rs.age)
从上面程序中可以看出,如果在某个方法中把 self 参数作为返回值,则可以多次连续调用同一个方法,从而使得代码更加简洁。但是这种把 self 参数作为返回值的方法可能会造成实际意义的模糊,例如上面的 grow 方法用于表示对象的生长,即 age 属性的值加 1,实际上不应该有返回值。
育乐教育网还为您提供以下相关内容希望对您有帮助:
一文读懂Python中self用法
Python中self的关键作用在于,当你创建一个类的实例时,self就仿佛是该实例的标识符,它在类的方法中作为第一个参数出现,实质上是将实例的引用传递给方法。类就像是赋予实例个性和功能的载体,通过self,每个独一无二的实例都能调用类中定义的属性和方法,就像人类个体持有身份证,可以参与社会活动一样。
Python self 参数详解
1. 类对象直接调用类的实例方法。2. 通过某个变量调用类的实例方法。无论采用哪种方式,self所表示的都是实际调用该方法的对象。因此,无论是类中的构造函数还是普通的类方法,实际调用它们的对象是哪个,则第一个参数self就代表哪个。
全面理解Python中的self
Python的内置属性和方法如__new__和__del__也有其特定的触发时机。__new__用于控制对象的创建,而__del__在对象不再被引用时自动调用。值得注意的是,并非所有类都需要使用self。例如,"静态类",如工具类util,其设计目的是为非实例化操作提供服务,如判断传入参数类型,如上所示。
关于python 类中 self 的通俗理解
首先,让我们澄清“对象”和“实例”。在Python中,一切都是对象,比如"Dog"类。实例,如xdog = Dog(),是类的实例化,Dog类是对象,而xdog是这个对象的实例。初始化可以类比为创造生命的过程,类就是“生孩子”的模板,它赋予了对象一些初始属性,如self.name = name和self.age = age。初次看到...
python中的self
首先,对于python,只有针对类来说的self才有意义,所以python中的self,说的即是python类中的self。以下我将结合python类的相关概念叙述,必须明确的是,self只能用在python类的方法(即函数)中。在我看来,python的类有三个相关概念:属性(即变量)、方法(即函数)、继承。1.属性(即变量)(1)...
Python中的self有啥用 self.name=name这句话有啥作用
self是对“对象”自身的引用。相当于c++中的this。python中self在类的方法中必须以传入参数写在函数的参数列表中。它实际上是指向类的对象的一个类似于C++中指针的私有变量。python规定:访问类成员时,需要在前面加上this。这里,this.name = name表示为Person类添加了属性name。如果变量前不加this,则...
Python中 __init__函数以及参数self怎么理解和使用?
但使用self可以保持编程一致性。在类的实例化过程中,self会自动传递,使方法能够直接操作实例的私有数据。总的来说,__init__是类的基石,它在实例化时初始化对象,提供数据封装,使得类的实例拥有独立的属性和操作。理解并熟练使用self,能帮助我们更好地构建和管理Python中的类和对象。
python中的self是什么
self是类的实例或对象。在Python中,self包含在第一个参数中。但是,Java中的情况并非如此,它是可选的。它有助于区分具有局部变量的类的方法和属性。init方法中的self变量引用新创建的对象,而在其他方法中,它引用其方法被调用的对象。
Python里面的self,是谁啊?
想要理解self有个最简单的方法,就是你把self当做 「实例(对象)的身份证。」Python的类不能直接使用,只有通过创建实例(对象)才能发挥它的功能,每个实例(对象)都是独一无二的,它可以调用类的方法、属性。类就像灵魂附体一样,让实例(对象)有了自己(self)的功能。初学者会发现,类的方法...
如何理解并正确使用python中的self
当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self的原理了。这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数。我这里补充一下几个实例程序以加深理解: class Person:def sayHi(...