JavaScript和Python中的类和继承的对比

275 阅读3分钟

一点小感悟

今天复习 JavaScript 中的类和继承,顺带着也看了看 Python 中的相关内容。

把两种语言放在一起,通过对比的角度去看,发现不仅没把两者弄混淆,反而把结构记得更清楚了,或许这也是一种另类的学习方法?

另外仔细对比 this 和 self,或许理解会更深一些;

先看 JavaScript 中的类和继承:

JavaScript中的类和继承

class Dog{
    constructor(name,age){
        this.name = name
        this.age = age
    }

    bark(){
        console.log(this.name + "说:汪汪汪");
    }
}

let dog1 = new Dog('小黑',2)

console.log('这只狗的名字叫' + dog1.name + ',它今年' + dog1.age + '岁了');
//这只狗的名字叫小黑,它今年2岁了

dog1.bark()
//小黑说:汪汪汪

继承

class Huskie extends Dog{
    constructor(name,age,type){
        super(name,age)
        this.type = type
    }

    skill(){
        console.log(this.name + '开始拆家了');
    }
}

let dog2 = new Huskie('二狗子',3,'哈士奇')

console.log('这只狗的名字叫' + dog2.name + ',它今年' + dog2.age + '岁了');
//这只狗的名字叫二狗子,它今年3岁了

console.log('这只狗的品种是'+ dog2.type);
//这只狗的品种是哈士奇

dog2.skill()
//二狗子开始拆家了

这里的type也可以提前设定好种类:

class Huskie extends Dog{
    constructor(name,age){ //注意这里type没了
        super(name,age)
        this.type = '哈士奇'
    }

    skill(){
        console.log(this.name + '开始拆家了');
    }
}

let dog2 = new Huskie('二狗子',3) //这里不用自己手动填写种类了

console.log('这只狗的名字叫' + dog2.name + ',它今年' + dog2.age + '岁了');
//这只狗的名字叫二狗子,它今年3岁了

console.log('这只狗的品种是'+ dog2.type);
//这只狗的品种是哈士奇

dog2.skill()
//二狗子开始拆家了

Python中的类和继承

class Dog():

    def __init__(self,name,age):
        self.name = name
        self.age = age
    
    def bark(self):
        print(self.name + '说:汪汪汪')

dog1 = Dog('小黄',2)

print('这条狗叫' + dog1.name + ',它今年' + str(dog1.age) + '岁了')
# 这条狗叫小黄,它今年2岁了

dog1.bark()
# 小黄说:汪汪汪

继承

class Huskie(Dog):

    def __init__(self, name, age, type):
      super().__init__(name,age)
      self.type = type

    def skill(self):
        print(self.name + '开始拆家了')

dog2 = Huskie('二狗子',2,'哈士奇')

print('这条狗叫' + dog2.name + ',它今年' + str(dog2.age) + '岁了')
# 这条狗叫二哈,它今年2岁了

print('这条狗的品种是' + dog2.type)
# 这条狗的品种是哈士奇

dog2.skill()
# 二狗子开始拆家了

同样这里的type也可以在构造方法里就设定好值,省的自己后面再手动加:

class Huskie(Dog):

    def __init__(self, name, age):
      # 注意上面的type不在参数里了
      super().__init__(name,age)
      self.type = '哈士奇'

    def skill(self):
        print(self.name + '开始拆家了')
 
dog2 = Huskie('二狗子',2) 
# 这里也不用手动填写种类了

print('这条狗叫' + dog2.name + ',它今年' + str(dog2.age) + '岁了')
# 这条狗叫二哈,它今年2岁了

print('这条狗的品种是' + dog2.type)
# 这条狗的品种是哈士奇

dog2.skill()
# 二狗子开始拆家了

用英语来理解super

super,特大的,超级的;

把父类看成老子,把要继承父类的类看成儿子,谁大?

肯定是父类大,儿子可以直接用老子的东西,省的自己再去搞了;

this 和 self

this 和 self 都是用来访问实例对象的属性和方法的,但是两种语言采用是不同的方法;Python里需要显性的自己写出来,而JavaScript不用;

如果仅从这个角度看的话,个人觉得 JavaScript 要比 Python 要简洁一丢丢;

更直观的对比

类的对比

实例的对比

继承的对比