Python self和Java之间的区别

时间:2014-02-11 06:40:15

标签: java python this self

我早就做了一点Python。然而,我现在转向Java。我想知道Python“self”方法和Java“this”之间是否存在任何差异。

我知道“自我”不是关键字,而“这”是关键字。这几乎是我能想到的。我错过了什么吗?

4 个答案:

答案 0 :(得分:63)

首先,让我纠正你 - self不是一种方法。进一步:

从技术上讲,selfthis都用于同一事情。它们用于访问与当前实例关联的变量。唯一不同的是,您必须将self显式地作为第一个参数包含在Python中的实例方法中,而Java不是这种情况。此外,名称self可以是任何名称。正如您所知,它不是关键字。您甚至可以将其更改为this,它会正常工作。但人们喜欢使用self,因为它现在已成为一种惯例。

这是一个访问Python和Java中的实例变量的简单实例方法:

的Python:

class Circle(object):
    def __init__(self, radius):
        # declare and initialize an instance variable
        self.radius = radius

# Create object. Notice how you are passing only a single argument.  
# The object reference is implicitly bound to `self` parameter of `__init__` method
circle1 = Circle(5);

爪哇:

class Circle {
    private int radius;

    public Circle(int radius) {
        this.radius = radius;
    }
}

Circle circle1 = new Circle(5);

另见:

答案 1 :(得分:30)

关于Python中的self(此处为来源:Python self explanation):

您需要使用 self 的原因。是因为Python不使用@语法来引用实例属性。 Python决定以某种方式执行方法,使得方法所属的实例自动传递,但不会自动传递:方法的第一个参数是调用该方法的实例。这使方法与函数完全相同,并保留实际名称以供您使用(尽管 self 是惯例,当您使用其他内容时,人们通常会对您不满。) self 对代码并不特殊,它只是另一个对象。

Python本可以做其他事情来区分普通名称和属性 - 像Ruby这样的特殊语法,或者需要像C ++和Java这样的声明,或者可能是更不同的东西 - 但事实并非如此。 Python的所有内容都是为了使事情变得明确,让它显而易见的是什么,虽然它并不是完全在任何地方完成,但它确实是为了实例属性。这就是为什么分配一个实例属性需要知道要分配的实例,这就是为什么它需要 self ..

Oracle解释Java中的this(此处为来源:Java this explanation):

在实例方法或构造函数中, this 是对当前对象的引用 - 正在调用其方法或构造函数的对象。您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。 使用 this 关键字的最常见原因是因为字段被方法或构造函数参数遮蔽。

答案 2 :(得分:11)

小心 super可以在Java中保留自己的this.i版本,但是 self.i总是引用Python中的孩子

<强> Main.java:

class Parent {

    int i;
    Parent() {
        this.i = 5;
    }

    void doStuff() {
        System.out.println(this.i);
    }
}

class Child extends Parent {
    int i;
    Child() {
        this.i = 7;
    }
}

class Main {

    public static void main(String[] args) {
        Child m = new Child();
        System.out.println(m.i); //print 7
        m.doStuff(); //print 5
    }
}

<强> Main.py:

class Parent(object):
    i = 5;
    def __init__(self):
        self.i = 5

    def doStuff(self):
        print(self.i)

class Child(Parent, object):

    def __init__(self):
        super(Child, self).__init__()
        self.i = 7

class Main():

    def main(self):
        m = Child()
        print(m.i) #print 7
        m.doStuff() #print 7

m = Main()
m.main()

<强>输出:

$ java Main 
7
5
$ python Main.py 
7
7

<强> [更新]

原因是因为int i类中的Java Child声明使i成为类范围变量,而Python子类中没有这样的变量阴影。如果删除int i类Java中的Child,它也会打印7和7。

答案 3 :(得分:1)

从我的角度来看,最明显的区别是在Java类中,在构造函数中,您需要指定字段

this.radius = radius

虽然在python代码中,您不必这样做,但它是隐式的。