62

所以我刚开始用python编程,我不明白'self'背后的全部原因。我知道它几乎就像一个全局变量一样使用,因此可以在类中的不同方法之间传递数据。我不明白为什么在同一个类中调用另一个方法时需要使用它。如果我已经在那个班,我为什么要告诉它?

例如,如果我有: 为什么我需要 self.thing()?

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"
4

6 回答 6

58

你也可以在课堂上制作方法,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"
于 2013-09-08T04:38:18.623 回答
13

一个原因是引用执行代码的特定类实例的方法。

此示例可能会有所帮助:

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

现在,您可以将其视为命名空间解析。

于 2013-09-08T02:32:00.640 回答
2

对我来说,self 就像一个作用域定义器,self.foo() 和 self.bar 表示类中定义的函数和参数,而不是其他地方定义的函数和参数。

于 2014-07-23T01:18:06.907 回答
2

简短的回答是“因为你可以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

上面的代码使得如果你创建一个Studentclass 和 call的对象bio,它会做所有的事情,如果它是Person有自己的bio被调用的 class 会发生的事情,然后它会做自己的事情。

这涉及到继承和其他一些你可能还没有看到的东西,但期待它。

于 2013-09-08T02:45:17.957 回答
2

我尝试了下面的代码,该代码在类中声明了带有 out 参数的方法,并使用类名调用了方法。

class Employee:

    def EmpWithOutPar():
        return 'Hi you called Employee'

print(Employee.EmpWithOutPar())

输出:嗨,你叫员工

于 2020-04-29T07:15:45.073 回答
0

您的班级之外可能还有另一个同名的函数。 self是对对象本身的对象引用,因此,它们是相同的。Python 方法不会在对象本身的上下文中调用。self在 Python 中可以用来处理自定义对象模型什么的。

于 2013-09-08T02:42:26.007 回答