一、Python和java中super的使用区别
在 Java 和 Python 中,子类调用父类方法的语法略有不同:
1 在 Java 中:
使用 super 关键字:在子类中,可以使用 super 关键字来调用父类的方法。super 关键字可以用来引用父类的构造方法或普通方法。
- 调用父类构造方法:在子类的构造方法中使用 super() 调用父类的构造方法。例如:
public class Child extends Parent {
public Child() {
super(); // 调用父类的无参构造方法(java里面这种无参构造java虚拟机就算你不写也会自动加上)
super(参数); // 调用父类的有参构造方法
}
}
如果父类有带参数的构造方法,可以通过 super(参数) 的形式传递参数给父类构造方法。
- 调用父类普通方法:在子类中可以使用 super.方法名() 的形式调用父类的普通方法。例如:
public class Parent {
public void printMessage(参数) {
System.out.println("Hello from Parent");
}
}
public class Child extends Parent {
public void printMessage() {
super.printMessage(参数); // 调用父类的 printMessage 方法
System.out.println("Hello from Child");
}
}
2 在 Python 中:
使用 super() 函数:Python 中的子类可以使用 super() 函数来调用父类的方法。super() 函数用于获取父类的对象,并且可以调用父类的方法。
- 调用父类构造方法:在子类的 init 方法中使用 super().init() 来调用父类的构造方法。例如:
class Parent:
def __init__(self):
print("Parent initialized")
class Child(Parent):
def __init__(self):
super().__init__(参数) # 调用父类的构造方法
print("Child initialized")
- 调用父类普通方法:同样地,在子类中可以使用 super().方法名() 的形式调用父类的普通方法。例如:
class Parent:
def print_message(self):
print("Hello from Parent")
class Child(Parent):
def print_message(self):
super().print_message() # 调用父类的 print_message 方法
print("Hello from Child")
- 另外,在pytorch搭建网络还延续了,Python2的super(当前类,self)使用习惯,在 Python 2 中,super 需要传递两个参数:当前类和 self 对象。但现在Python3这种语法已经可以抛弃了,直接super(),后面空括号就可以了,但pytorch大家搭建网络都还延续了Python2的那个习惯就随大流吧!
class RNN(nn.Module):
def __init__(self):
super(RNN, self).__init__() # super().__init__() python3现在只需要这样
self.rnn = nn.LSTM( # if use nn.RNN(), it hardly learns
input_size=INPUT_SIZE,
hidden_size=64, # rnn hidden unit
num_layers=1, # number of rnn layer
batch_first=True, # input & output will has batch size as 1s dimension. e.g. (batch, time_step, input_size)
)
self.out = nn.Linear(64, 10)
def forward(self, x):
# x shape (batch, time_step, input_size)
# r_out shape (batch, time_step, output_size)
# h_n shape (n_layers, batch, hidden_size)
# h_c shape (n_layers, batch, hidden_size)
r_out, (h_n, h_c) = self.rnn(x, None) # None represents zero initial hidden state
# choose r_out at the last time step
out = self.out(r_out[:, -1, :])
return out
二、Pycharm与IDEA中关于当前工作路径的区别
(1)区别
在学习相对路径的时候,我们学过相对路径都是相对于当前工作目录而言的,由于Pycharm与IDEA中关于当前工作路径的默认设置有一定区别,所以在相对路径的处理上就会产生不同效果了。
-
PyCharm 中默认的当前工作目录
在 PyCharm 中,默认情况下,当前工作目录通常会被设置为项目的根目录,但如果你是在运行一个脚本,它可能会选择该脚本所在的目录的上一级作为当前工作目录,或者基于运行/调试配置中的指定设置。 -
IntelliJ IDEA 中默认的当前工作目录
在 IntelliJ IDEA 中(特别是对于 Java 项目),默认的当前工作目录通常是项目的根目录,而不是源代码目录(如 src)。因此,如果你在 Java 中运行时没有指定路径,它默认会在项目根目录下创建文件。
简单来说,无论你在IDEA里面多深的位置运行一个JAVA文件,当前工作路径都是最上层的项目根目录,而不会是当前正在运行的java文件的父文件(这是与Pycharm典型的差别)
我们可以用代码来验证这一点:
PyCharm:
IntelliJ IDEA
可以看到区别很明显
【注】:Pycharm和IntelliJ IDEA都可以在设置中改变当前工作目录,但我们一般使用默认就可以了,就不要给自己找事情了。
(2)对相对路径的影响
上面这个区别主要影响到的就是相对路径的使用注意在切换语言时
都以相对路径的文件操作为例子吧!
PyCharm:
IntelliJ IDEA
可以看到给我们干到根目录下面去了,不是在 Study\demo\src\cn\hjblogs\demo下
如果我们非要到Study\demo\src\cn\hjblogs\demo下可以