美文网首页
Python学习(十二)--面向对象三大特性之一--继承性

Python学习(十二)--面向对象三大特性之一--继承性

作者: 白面葫芦娃92 | 来源:发表于2020-04-02 11:23 被阅读0次

    建议一个py文件下只写一个类
    先写一个父类:

    class Human():
        sum = 0
        
        def __init__(self,name,age):
            self.name = name
            self.age = age
        
        def get_name(self):
            print(self.name)
    

    再写一个子类继承这个父类:

    from c3 import Human
    
    class Student(Human):
    
        def do_homework(self):
            print('english homework')
    
    student1 = Student('小明', 18)
    print(student1.sum)
    print(Student.sum)
    print(student1.name)
    print(student1.age)
    student1.get_name()
    

    运行结果

    0
    0
    小明
    18
    小明
    

    说明子类继承了父类的变量(包括类变量和实例变量)和方法

    Python支持多继承,一个子类可以继承多个父类,其他语言都是单继承

    上边这种情况,子类没有自己特有的变量,一般情况下不会出现这种没有意义的子类,下面我们来修改一下子类,增加一个子类特有的变量school:

    from c3 import Human
    
    class Student(Human):
    
        def __init__(self, school, name, age):
            self.school = school
            Human.__init__(self, name, age)
    
        def do_homework(self):
            print('english homework')
    
    if __name__ == "__main__":  
        student1 = Student('清华大学', '小明', 18)
        print(student1.name)
        print(student1.age)
        print(student1.school)
    

    直接引用了父类的构造函数,但注意

    Human.__init__(self, name, age)
    

    不可以写为

    Human.__init__(name, age)
    

    不然会报错

    Traceback (most recent call last):
      File "c2.py", line 13, in <module>
        student1 = Student('清华大学', '小明', 18)
        Human.__init__(name, age)
    TypeError: __init__() missing 1 required positional argument: 'age'
    

    为什么呢?因为Human.__init__(name, age)相当于直接用类Human来调用了构造函数,通常我们是实例化之后再调用的,因此,使用类直接调用方法时,参数需要加上self,我们可以通过子类的方法do_homework试验一下

    from c3 import Human
    
    class Student(Human):
    
        def __init__(self, school, name, age):
            self.school = school
            Human.__init__(self, name, age)
    
        def do_homework(self):
            print('english homework')
    
    if __name__ == "__main__":  
        student1 = Student('清华大学', '小明', 18)
        Student.do_homework()
    

    运行报错:

    Traceback (most recent call last):
      File "c2.py", line 21, in <module>
        Student.do_homework()
    TypeError: do_homework() missing 1 required positional argument: 'self'
    

    但是直接调用父类的构造函数的方式很奇怪,因为一个类调用了一个实例方法,不符合面向对象的原则,此处能够调用体现了Python的灵活性,但是不要这么使用
    为了实现更换所继承的父类时,不修改过多子类内部代码
    上方的Human.__init__(self, name, age)不推荐使用,而是应该使用super

    from c3 import Human
    
    class Student(Human):
    
        def __init__(self, school, name, age):
            self.school = school
            super(Student, self).__init__(name, age)
    
        def do_homework(self):
            print('english homework')
    
    if __name__ == "__main__":  
        student1 = Student('清华大学', '小明', 18)
        print(student1.name)
        print(student1.age)
        print(student1.school)
    

    运行结果

    小明
    18
    清华大学
    

    子类除了可以调用父类的构造方法,还可以调用父类的其他方法,下面给父类Human增加一个方法与子类Student同名的方法do_homework:

    class Human():
        sum = 0
    
        def __init__(self,name,age):
            self.name = name
            self.age = age
        
        def get_name(self):
            print(self.name)
    
        def do_homework(self):
            print('This is a parent method')
    
    from c3 import Human
    
    class Student(Human):
    
        def __init__(self, school, name, age):
            self.school = school
            super(Student, self).__init__(name, age)
    
        def do_homework(self):
            print('english homework')
    
    if __name__ == "__main__":  
        student1 = Student('清华大学', '小明', 18)
        student1.do_homework()
    

    运行结果

    english homework
    

    可见,当父类方法和子类方法同名时(Python是允许的,不会报错),优先调用子类的方法,下面我们在子类的do_homework方法中调用父类的do_homework方法:

    from c3 import Human
    
    class Student(Human):
    
        def __init__(self, school, name, age):
            self.school = school
            # Human.__init__(self, name, age)
            super(Student, self).__init__(name, age)
    
        def do_homework(self):
            super(Student, self).do_homework()
            print('english homework')
    
    if __name__ == "__main__":  
        student1 = Student('清华大学', '小明', 18)
        student1.do_homework()
    

    运行结果

    This is a parent method
    english homework
    

    相关文章

      网友评论

          本文标题:Python学习(十二)--面向对象三大特性之一--继承性

          本文链接:https://www.haomeiwen.com/subject/rgkwuhtx.html