Python calling method without 'self'
所以我刚开始用python编程,我不理解"self"背后的整个推理。我理解它的使用方式与全局变量几乎相同,这样就可以在类中的不同方法之间传递数据。我不明白为什么在调用同一类中的另一个方法时需要使用它。如果我已经在那门课上了,我为什么要说呢??
例如,如果我有:为什么我需要self.thing()?
1 2 3 4 5 6 | class bla: def hello(self): self.thing() def thing(self): print"hello" |
也可以在类
你的:
1 2 3 4 5 6 | class bla: def hello(self): self.thing() def thing(self): print"hello" |
静态版:
1 2 3 4 5 6 7 8 | class bla: @staticmethod def hello(): bla.thing() @staticmethod def thing(): print"hello" |
一个原因是引用在其中执行代码的特定类实例的方法。
此示例可能有助于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def hello(): print"global hello" class bla: def hello(self): self.thing() hello() def thing(self): print"hello" b = bla() b.hello() >>> hello global hello |
现在,您可以把它看作是名称空间解析。
简短的回答是"因为您可以将cx1〔2〕作为一个全局函数,或者作为另一个类的方法。"以这个(可怕的)例子为例:
1 2 3 4 5 6 7 8 9 10 | def thing(args): print"Please don't do this." class foo: def thing(self,args): print"No, really. Don't ever do this." class bar: def thing(self,args): print"This is completely unrelated." |
这很糟糕。不要这样做。但如果你这样做了,你可以打电话给
1 2 3 4 5 6 7 8 | class Person: def bio(self): print"I'm a person!" class Student(Person): def bio(self): Person.bio(self) print"I'm studying %s" % self.major |
上面的代码使得,如果你创建一个EDCOX1的对象,4个类,并调用EDCOX1(5),它将完成所有的事情,如果它是EDOCX1,6个类,它有自己的EDCOX1,5调用,它将做它自己的事情之后。
这会继承和其他一些你可能还没见过的东西,但是期待它。
一个镜像反映了Java和Python之间的差异:Java可以在没有自的类中使用方法,因为调用方法的唯一方法是从Objor或Objo调用,所以编译器的方式是清晰的。虽然这可能会混淆python的转换器,并在运行时花费大量时间在整个名称空间上查找符号表,因为函数和类方法都是函数调用的潜在候选,因为不使用"self"。如果使用这种方法,Python速度将比C和Java速度慢一点,这可能会降低它的吸引力。
对我来说,self就像一个范围定义器,self.foo()和self.bar指示在类中定义的函数和参数,而不是在其他地方定义的函数和参数。
类之外可能还有另一个同名的函数。