类成员——Java与Python



我来自Java,现在正在学习Python。我试图理解Python中类成员的概念。

下面是一个Java示例程序:

class Hello {
int x = 0;
void ex() {
x = 7;
}
public static void main(String args[]) {
Hello h = new Hello();
System.out.println(h.x);
h.ex();
System.out.println(h.x);
}   }

这就是我在Python中所做的,下面是我发现的一些例子:

class Hello:
def __init__(self) :
self.x = 0
def ex(self):
self.x = 7
h = Hello()
print(h.x)
h.ex()
print(h.x)

两个程序都返回:

0
7

以下是我的问题:

  1. Python代码正确吗
  2. 在我看来,与Java相比,Python的编程风格更加紧凑。所以我想知道,为什么Python需要传递一个"self"——参数
  3. 在这一点上,Python似乎比Java更"复杂"。或者有没有办法去掉"self"--参数

首先,您的python代码是正确的。

这只是语言如何设计的问题。Java使用了一种对对象引用的自动推断。对于非java专家来说,它有时会导致奇怪的行为:

private int a; 
public int add(int a, int b){
return a+b; // what a will it use? 
}

因此,这就是为什么在java中可以使用关键字this(但不是强制的)来解决这种歧义。

python团队决定强制使用self这个词(或者任何其他词,但我稍后会解释)来避免这种问题。你无法摆脱它。尽管如此,java仍然是一种比python更详细的语言,关键字self并没有对这种假设产生太大影响。

但是,您不必使用"self"一词来引用当前对象。您可以使用任何其他单词作为方法的第一个参数(但这是一种非常糟糕的做法)。

在这里,你可以看到两个参考文献,它们深刻地解释了为什么"自我会留在这里":

http://www.programiz.com/article/python-self-why

http://neopythonic.blogspot.be/2008/10/why-explicit-self-has-to-stay.html

所以在java中,结构通常是

Class
private data (aka the "struct")
public data
constructors (__init__ in python)
functions etc

它在python中非常相似。同样的结构只适用于处理需要将self作为参数的数据的任何函数。在java中,它不必接受参数。

此外,在python中,所有数据默认情况下都是公共的,因此您不需要像在java中那样使用getter和setter。

就我个人而言,我发现Python类更像是一个带有一些附加功能的C结构,其中java的所有内容都被放入一个类中。

值得一提的是,当你有很多字段时,你可以通过使用库来删除样板来保存几行代码。例如pyfields:

from pyfields import field, make_init
class Hello:
x = field(default=0)
y = field()
__init__ = make_init()
h = Hello(y=10)
print((h.x, h.y))

产生

(0, 10)

你甚至可以将它与autoclass结合起来,获得开箱即用的几个功能:

from autoclass import autoclass
from pyfields import field
@autoclass
class Hello:
x = field(default=0)
y = field()
h = Hello(y=1)
print(h)
assert h == {'x': 0, 'y': 1}
print(dict(h))

产生

Hello(x=0, y=1)
{'x': 0, 'y': 1}

有关详细信息,请参阅文档。顺便说一句,我是作者;)

2.)Python是一种高级语言。我猜java在哪里更适合中高级。对java来说有点陌生。

python使用空白,java需要更多的格式。

3.)可以去除自身参数。用你想称之为的东西替换

最新更新