所以我刚开始用python编程,我不明白'self'背后的整个推理。我知道它几乎像一个全局变量一样使用,因此数据可以在类中的不同方法之间传递。当你在同一个类中调用另一个方法时,我不明白为什么你需要使用它。如果我已经上课,为什么我要告诉它?
例如,如果我有: 为什么我需要self.thing()?
class bla:
def hello(self):
self.thing()
def thing(self):
print "hello"
答案 0 :(得分:18)
您也可以在课程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"
答案 1 :(得分:9)
一个原因是引用特定类的实例的方法,在该实例中执行代码。
此示例可能有所帮助:
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
目前,您可以将其视为命名空间解析。
答案 2 :(得分:3)
简短的回答是“因为你可以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
类的对象并调用bio
,它会完成所有可能发生的事情Person
具有自己的bio
名为和的类,之后它会做自己的事情。
这会进入继承和其他一些你可能还没有看到过的东西,但是期待它。
答案 3 :(得分:0)
在课堂外可能有另一个同名的功能。
self
是对象本身的对象引用,因此它们是相同的。
Python方法不在对象本身的上下文中调用。 Python中的self
可用于处理自定义对象模型或其他内容。
答案 4 :(得分:0)
对我来说,自我就像一个范围定义器,self.foo()和self.bar表示在类中定义的函数和参数,而不是在其他地方定义的那些。
答案 5 :(得分:0)
一面镜子反映了java和python的区别:java可以在类中使用方法而不使用self,因为调用方法的唯一方法是从类或obj,因此编译器很清楚。尽管这可能会混淆python的翻译程序,并在运行时浪费大量时间在整个名称空间上查找符号表,但由于未使用'self',因此函数和类方法都是函数调用的潜在候选者。如果采用这种做法,与C和Java相比,python的速度将再次降低,这可能使其吸引力降低。
答案 6 :(得分:0)
我尝试了下面的代码,该代码在类中声明了带out参数的方法,并使用类名调用了方法。
class Employee:
def EmpWithOutPar():
return 'Hi you called Employee'
print(Employee.EmpWithOutPar())
输出: 嗨,你叫员工