为什么类默认情况下的python函数使用“ self”作为传入的第一个参数

QPe*_*ran -1 python oop python-3.x

我正在学习python类atm。在进行一些编码实验时,会出现一个问题:当我们使用在类中定义的函数时,第一个参数“默认”作为“自我”作为该对象传入。甚至我尝试重命名它或交换序列。第一个参数仍然执行为“自我”

这是python中的黄金法则吗?但为什么?

class people:
    def __init__(self,name):
        self.name=name

    def test1(k):
        return k.name

    def test2(o):
        print(o)

    def test3(i,j):
        print(i.name+j)

    def test4():
        print("test4")

    def test5(m,self):
        print(str(m)+self)

a=people('Dummy')
print(a.test1()) # "Dummy"
a.test2()        # "<__main__.people object at REFFERENCE>"
a.test2("test2") # error:test2() takes 1 positional argument but 2 were given
a.test3("test3") # "Dummytest3"
a.test4()        # error:test4() takes 0 positional arguments but 1 was given
a.test5("test5") # "<__main__.people object at REFFERENCE>test5"
Run Code Online (Sandbox Code Playgroud)

请参阅我的代码以供参考。我很好奇的是:

  1. a.test2(“ test2”)-从直觉上讲,我认为当我们使用一个函数(与C ++类,如下面的代码一样)时,它将输出“ test2”。但是已经输入默认的“ this”作为第一个参数。
class MyClass {         
  public:               
    void myMethod(string test) {   
      cout << test;
    }
};

int main() {
  MyClass myObj;     
  string test = "testC++";
  myObj.myMethod("testC++");  
  return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. a.test5-我在函数定义中切换了“ self”和参数“ m”。Python将“ m”表示为“ this”,将“ self”用作函数的输入参数。这是否表明第一个参数必须是“ this”,即使它没有命名为“ self”?

Pru*_*une 5

首先,您无法更改它是错误的:您可以使用任意喜欢的参数名称。 self只是惯例,与this其他语言this类似-尽管有些语言具有预定义或保留词。

例如:

class Dummy():
    def __init__(this):
        this.name = "self"
        this.value = 0

thing = Dummy()
print(thing.name, thing.value)
Run Code Online (Sandbox Code Playgroud)

输出:

self 0
Run Code Online (Sandbox Code Playgroud)

但是,Python 确实将第一个参数的语义强制用于任何实例方法:根据语言定义,该参数是调用该方法的实例。这样做可确保您可以在类中任何此类方法的已知稳定位置中随时访问调用实例。