首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python self与Java之间的区别

Python self与Java之间的区别
EN

Stack Overflow用户
提问于 2014-02-11 06:40:15
回答 4查看 103.9K关注 0票数 85

我很久以前就做过Python了。不过,我现在要转到Java了。我想知道Python "self“方法和Java "this”之间是否有什么区别。

我知道“自我”不是关键词,而“这”是。这几乎就是我能弄明白的。我还有什么遗漏吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-11 06:51:38

关于Python中的self Python自解释): 的(以下是源代码:)

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

Python本可以做一些其他的事情来区分普通名称和属性--比如Ruby所具有的特殊语法,或者需要像C++和Java这样的声明,或者更不同的东西--但它没有做到。Python完全是为了使事情变得清晰,清楚地知道是什么,虽然它并不是在任何地方都这样做,但是它可以做一些例如属性。这就是为什么分配给一个实例属性需要知道要分配给哪个实例,这就是为什么它需要自我..。

由甲骨文解释的关于this Java这个解释): 的(以下是源代码:)

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

票数 43
EN

Stack Overflow用户

发布于 2014-02-11 06:56:21

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

从技术上讲,selfthis都用于同一件事。它们用于访问与当前实例关联的变量。唯一的区别是,您必须在Python中显式地将self作为实例方法的第一个参数,而不是这样。而且,self这个名字可以是任何东西。这不是关键词,你已经知道了。您甚至可以将其更改为this,这样就可以正常工作了。但是人们喜欢使用self,因为现在它已经成为一种惯例。

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

Python:

代码语言:javascript
复制
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);

爪哇:

代码语言:javascript
复制
class Circle {
    private int radius;

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

Circle circle1 = new Circle(5);

还请参见:

  • this
票数 124
EN

Stack Overflow用户

发布于 2016-06-06 12:48:24

请小心,超级程序可以保留它自己的版本,我在中使用,但本身,我总是在中引用子版本。

Main.java:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
$ java Main 
7
5
$ python Main.py 
7
7

更新

原因是因为int i类中的i声明使i成为类作用域变量,而在i子类中却没有这样的变量。如果在Java的int i类中删除Child,它也会打印7和7。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21694901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档