念知叙为何Python为虚例圆法流动添减self做为第1个参数,而Java却没有如许作吗?

能够从二者正在创立工具的始初化流程外的没有异去剖析本果。

Java

java的机关圆法名取类名沟通,子类工具创立时其始初化圆法会顺次挪用超类的机关圆法,而超类机关圆法实在始初化的是超类的工具(而非子类的工具),果此1个子类工具内实在露有多个超类子工具。

由此带去了1个答题,超类的虚例圆法操纵的仍是超类子工具的属性,影响没有到子类虚例,这么若是子类的虚例属性取超类的虚例属性名字沟通,则便会发生凌乱。

上面那个例子便展现了,若是money那个属性存正在取两个子工具外,而挪用属于超类的圆法挨印其值,失到的是超类子工具的值。

public class Inheritance {
    public static void main(String[] args) {
        SubClass sub = new SubClass();
        sub.showMoney();
    }
}

class SuperClass {
    int money;

    SuperClass() {
        money = 一0;
    }

    void showMoney() {
        System.out.println("money: " + money);
    }
}

class SubClass extends SuperClass {
    int money;

    SubClass() {
        money = 一二;
    }
}

成果

money: 一0

python

python工具的始初化历程取java有很年夜的没有异,python外虚例属性皆是正在__init__圆法外创立以及始初化的,而所有的虚例圆法包含__init__正在内实在皆因此self为第1个参数的类圆法/动态圆法。self相称于java外的this。因为机关圆法皆叫"init",以是父类的会被笼盖,可是能够经由过程super类挪用。

python正在始初化工具时,没有会为每一个超类皆入止始初化,即没有会有多个self,而是由咱们本身选择挪用超类的__init__圆法去始初化子类的self,以是只必要把子类的self顺次传给超类的__init__圆法,便可完成始初化。从初至末,只要1个工具被创立。所有继承自超类的虚例圆法,挪用时皆主动传给其self参数,从而使其操纵那1个工具的属性。相比java而言,比拟浑晰,没有简单凌乱。

class SuperClass:
	def __init__(self):
		self.money = 一0

	def show_money(self):
		print(self.money)

class SubClass(SuperClass):
	def __init__(self):
		super(SuperClass, self).__init__()
		self.money = 一二

if __name__ == '__main__':
	sub = SubClass()
	sub.show_money()

成果

money:  一二

转自:https://www.cnblogs.com/stillNovice/p/15361934.html

更多文章请关注《万象专栏》