56.C#和python類繼承中的構造函數問題

一、C#類繼承中的構造函數

public class Animal:Creature
{
    public Animal():this("馬")//注意:這裏是實際參數,不是對參數的定義。
    {
        Console.WriteLine("這是Animal類");
    }

    public Animal(string str):base(str)
    {
        Console.WriteLine($"這是帶參數的Animal類。參數是{str}");
    }
}

public class Creature
{
    public Creature()
    {
        Console.WriteLine("這是Creature類");
    }
    public Creature(string str)
    {
        Console.WriteLine($"這是帶參數的Creature類,參數是{str}");
    }
}
static void Main(string[] args)
{
    //第一步,調用Creature()
    //第二步,調用Animal("馬")
    //第三步,調用Animal()函數體裏的代碼

    Animal ani = new Animal();
    //第一步,調動Creature("驢")
    //第二步,調用Animal("驢")
    Animal ani2 = new Animal("驢");

}

輸出是:

二、python類繼承中的構造函數

class Creatrue:
    def __int__(self):
        print("這是Creature類")
    # 以下不是構造函數
    # def Creature(self):
    #     print("這是Creature類")
    # def Creatrue(self,str):
    #     print("這是帶參數的Creature類,參數是"+str)

class Animal(Creatrue):
    def __init__(self):
        print("這是Animal類")

class Animal_1(Creatrue):
    def __init__(self):
        Creatrue.__int__(self)
        print("這是Animal_1類")

class Animal_2(Creatrue):
    def __init__(self):
        super(Animal_2, self).__init__()
        print("這是Anima1_2類")
#注意:重寫_init__不會自動調用基類的__init__。
#要調用必須明確地寫出代碼。
ani=Animal()
ani1=Animal_1()
ani2=Animal_2()

輸出是:

三、C#和Python此處語法的不同

1.構造函數方法不同

C#中要用類名()作爲構造函數,python中用__init__專有函數作爲構造函數。

2.對基類構造函數調用不同

在c#中調用繼承類構造函數時,會強制調用基類構造函數。python則不調用基類構造函數,除非在繼承類構造函數中明確調用基類構造函數。兩個各有利弊。前者省事,後者自由。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章