Python 的 self 和 C# 的 this


🧩 一、基本作用对比

对比点Python 中的 selfC# 中的 this
含义当前对象的引用(实例本身)当前对象的引用(实例本身)
显式性必须显式写出在方法参数中(通常命名为 self编译器隐式提供,在实例方法中自动可用
是否关键字不是关键字,只是约定俗成的名字(可改成别的)语言关键字
使用场景类的实例方法第一个参数必须传入 self类的实例方法可直接使用 this
静态方法是否可用不可用,除非手动传实例不可用,只能用于实例方法

🧠 二、示例对比

🐍 Python

1
2
3
4
5
6
class Person:
    def __init__(self, name):
        self.name = name  # self 指当前实例

    def greet(self):
        print(f"Hello, I'm {self.name}")

使用:

1
2
p = Person("Alice")
p.greet()   # 等价于 Person.greet(p)

✅ 注意:调用 p.greet() 时,Python 自动传入 self=p


💻 C#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Person
{
    private string name;

    public Person(string name)
    {
        this.name = name; // this 指当前实例
    }

    public void Greet()
    {
        Console.WriteLine($"Hello, I'm {this.name}");
    }
}

使用:

1
2
var p = new Person("Alice");
p.Greet();   // 编译器自动绑定 this = p

✅ 在 C# 中不需要显式传参,this 是隐式存在的。


⚙️ 三、调用机制差异

对比点PythonC#
方法本质实例方法其实是普通函数,通过绑定对象成为“方法”实例方法是类成员,编译器自动关联实例
调用本质p.greet()Person.greet(p)p.Greet() → 编译器自动传递 this
函数与方法界限较模糊(函数本身独立于类存在)明确区分(方法绑定在类型上)

🧩 四、可用场景差异

场景Python (self)C# (this)
引用实例成员self.namethis.name(也可省略)
区分同名变量self.name = name(手动)this.name = name(常用)
链式调用return self 可实现return this 可实现
静态方法@staticmethod 不带 selfstatic 方法不能用 this
类方法@classmethodcls(类本身)没有类似的机制(但可用泛型或反射实现)

💡 五、总结一句话

self 是 Python 显式传递的实例引用; this 是 C# 编译器隐式提供的实例引用。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计