Python self与Java的区别

2024-04-23 21:12:06 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

首先,让我纠正一下-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);

另请参见:

关于Python中的self(这里是源代码:Python self explanation):

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

Python可能已经做了一些别的事情来区分普通名字和属性——像露比那样的特殊语法,或者需要像C++和java做的声明,或者可能有些不同的东西——但是它没有。Python的全部都是为了使事情变得明确,使它明显的是什么,尽管它并不是到处都是。它是为实例属性而做的。这就是为什么分配给实例属性需要知道分配给哪个实例的原因,这也是为什么它需要self的原因。。

关于Java中由Oracle解释的this(这里是源代码:Java this explanation):

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

注意,super可以保留它自己的版本,Java中的i,但是self,Python中的child总是指的。

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

[更新]

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

相关问题 更多 >