所以我刚开始用python编程,我不明白'self'背后的全部原因。我知道它几乎就像一个全局变量一样使用,因此可以在类中的不同方法之间传递数据。我不明白为什么在同一个类中调用另一个方法时需要使用它。如果我已经在那个班,我为什么要告诉它?
例如,如果我有: 为什么我需要 self.thing()?
class bla:
def hello(self):
self.thing()
def thing(self):
print "hello"
你也可以在课堂上制作方法,static
所以不需要self
. 但是,如果您确实需要,请使用它。
你的:
class bla:
def hello(self):
self.thing()
def thing(self):
print "hello"
静态版:
class bla:
@staticmethod
def hello():
bla.thing()
@staticmethod
def thing():
print "hello"
一个原因是引用执行代码的特定类实例的方法。
此示例可能会有所帮助:
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
现在,您可以将其视为命名空间解析。
对我来说,self 就像一个作用域定义器,self.foo() 和 self.bar 表示类中定义的函数和参数,而不是其他地方定义的函数和参数。
简短的回答是“因为你可以def thing(args)
作为一个全局函数,或者作为另一个类的方法。举这个(可怕的)例子:
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."
这是不好的。不要这样做。但如果你这样做了,你可以打电话thing(args)
,事情就会发生。如果您有相应的计划,这可能是一件好事:
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
上面的代码使得如果你创建一个Student
class 和 call的对象bio
,它会做所有的事情,如果它是Person
有自己的bio
被调用的 class 会发生的事情,然后它会做自己的事情。
这涉及到继承和其他一些你可能还没有看到的东西,但期待它。
我尝试了下面的代码,该代码在类中声明了带有 out 参数的方法,并使用类名调用了方法。
class Employee:
def EmpWithOutPar():
return 'Hi you called Employee'
print(Employee.EmpWithOutPar())
输出:嗨,你叫员工
您的班级之外可能还有另一个同名的函数。
self
是对对象本身的对象引用,因此,它们是相同的。Python 方法不会在对象本身的上下文中调用。self
在 Python 中可以用来处理自定义对象模型什么的。