Python和java中super的使用用法(有点小语法上的差距)和Pycharm与IDEA中关于当前工作路径的区别:使用相对路径时注意(老忘就在这里置顶了)


一、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下可以
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值