Python为什么不使用类似C++ / Java的语法来定义实例变量? - java

就像我来自C++世界一样,这困扰了我几个小时。我终于知道发生了什么,但是我不知道为什么这是默认行为。我想了解为什么用这种方式设计语言。

我想要一个实例变量mem。所以我尝试了这个:

class x(object):
   mem = []

obj = x()
obj.mem.append(1)
print(obj.mem)
objTWO = x()
objTWO.mem.append(2)
print(objTWO.mem)

哪个打印此:

[1] 

[1, 2]

鉴于:

class x(object):

    def __init__(self):
        self.mem = []

obj = x()
obj.mem.append(1)
print(obj.mem)
objTWO = x()
objTWO.mem.append(2)
print(objTWO.mem)

版画

[1]

[2]

为什么第一个是默认行为?这里的直觉是什么,因为它与几种主流的OO语言相反(它们为大写字母引入了static关键字,这使您明确地说要使用静态变量)?对于Python的新手来说,这是一个惊喜。

另外,似乎允许您使用同名的实例变量和类变量:

class x(object):
    mem = []

    def __init__(self):
        self.mem = []

我必须运行此命令才能弄清楚要打印的内容。我什至猜不到!

参考方案

直觉是在Python中,一切都是对象,包括类本身。 Python中没有“static”关键字。有些类是对象,而这些类具有属性。类定义中出现的所有内容都是类属性-包括方法和其他类型的属性。

这种设计的好处是简单性和一致性。公共属性或私有属性之间,静态属性与非静态属性之间没有区别。类和实例属性之间的区别通过类构造函数自然而然地显现出来。调用__init__时(间接通过ClassName(params)),它通过self参数接收该类的新实例,然后直接修改该实例。一切都通过已定义的构造显式进行-您无需了解任何新语法或新关键字即可查看创建实例时发生的情况。

然后,您只需要了解Python的属性查找模型即可。在大多数shell中,它的工作原理与PATH分辨率几乎相同。例如,在bash中,当您执行命令(ls)时,将搜索路径中的第一个条目,然后搜索第二个,依此类推,找到的命令的第一个版本就是已执行的命令。但是在这种情况下,路径如下所示(至少在具有单一继承的简单情况下):

instance; class; superclass; superclass; ... and so on

这与c或c ++的嵌套作用域中的名称解析确实没有什么不同。您抱怨:

更糟糕的是,似乎允许您使用相同名称的实例变量和类变量。

但是,与c允许您在一个块中定义int i;,创建一个内部块,然后定义另一个遮罩原始的int i;的事实相比,这真的更加令人困惑吗?

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

谁能解释有关动态或静态语言的C C++ Java - java

谁能解释C C++ Java有关动态类型或静态类型的语言。我在某处读到C C++和Java都是静态语言。但是我记得关于这些还有其他意见。很混乱。谢谢! 参考方案 还有其他意见吗?毫无疑问,C,C++和Java都是静态类型的语言,而C++和Java具有一些动态类型的功能。还有另一个问题:强类型与弱类型,主要与隐式转换和重载有关。 Web上有许多关于这些问题的深…

Java和C++共享内存 - java

我有一段创建共享内存的C++代码。是否可以编写Java代码来读取C++代码创建的内存,除非使用JNI。顺便说一句,我正在使用Windows操作系统。 参考方案 请参见MappedByteBuffer。这是读写共享内存的标准Java类。我经常使用。是的,您可以使用它与使用共享内存以任何语言编写的任何程序进行通信,并且这都是非常标准的Java,没有JNI。

Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…

我可以使用JNI在Java代码中引用C++对象吗? - java

我在任何地方都没有看到(或者也许我很简单,没有看到它),但是有没有办法使用JNI返回c / c ++对象并在Java中使用该对象?例如(非常简单):class simpleClass{ ... private: int intVar; public: int getIntVar(); void setIntVar(int someNum); ... } 在我…