Python self和Java之间的区别

Bay*_*yko 50 python java this self

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

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

Roh*_*ain 68

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

从技术上讲两者selfthis用于同样的事情.它们用于访问与当前实例关联的变量.唯一不同的是,您必须self明确地将其作为第一个参数包含在Python中的实例方法中,而Java则不是这样.而且,名字self可以是任何东西.正如您所知,它不是关键字.你甚至可以改变它this,它会工作正常.但人们喜欢使用self,因为它现在变得有点习惯.

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

蟒蛇:

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);
Run Code Online (Sandbox Code Playgroud)

Java的:

class Circle {
    private int radius;

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

Circle circle1 = new Circle(5);
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 谢谢,比复制/粘贴接受的答案,恕我直言,更有帮助 (9认同)
  • 请注意@林果皞提到的继承和重写的区别。如果你有父子类层次结构,在 Java 中,父类中的“this”指的是父类,但在 python 中,父类中的“self”指的是子类。 (2认同)

01_*_*1__ 33

关于selfPython(这里是源代码:Python自我解释):

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

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

关于thisJava正在解释Oracle(这里是来源:Java这个解释):

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


林果皞*_*林果皞 12

小心超级可以在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
    }
}
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

输出:

$ java Main 
7
5
$ python Main.py 
7
7
Run Code Online (Sandbox Code Playgroud)

[更新]

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