关于类:没有’self’的Python调用方法

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"


也可以在类static中生成方法,因此不需要self。但是,如果您真的需要的话,可以使用这个。

你的:

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."

这很糟糕。不要这样做。但如果你这样做了,你可以打电话给thing(args),就会发生一些事情。如果您相应地计划,这可能是一件好事:

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指示在类中定义的函数和参数,而不是在其他地方定义的函数和参数。


类之外可能还有另一个同名的函数。self是对象本身的对象引用,因此它们是相同的。不能在对象本身的上下文中调用Python方法。python中的self可用于处理自定义对象模型或其他东西。