没有'self'的Python调用方法

时间:2013-09-08 02:27:42

标签: python class self

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

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

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

    def thing(self):
        print "hello"

7 个答案:

答案 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())

输出: 嗨,你叫员工