菜比之路

走菜比的路,让大牛说去吧
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

【python】类的继承和super关键字

Posted on 2016-08-31 16:36  毕加索的ma  阅读(465)  评论(0编辑  收藏  举报

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现

继承概念的实现方式主要有2类:实现继承、接口继承。

Ø         实现继承是指使用基类的属性和方法而无需额外编码的能力;
Ø         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)
单继承:
 
class Person(object):
    def __init__(self, name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("person is eating")
        self.num = 10
class Man(Person):
    def __init__(self, name, age,money):
        super(Man,self).__init__(name, age)  ##使用super继承,等于 Person.__init__(self,name,age)
        self.money=money
多继承
Python2 经典类是按照深度优先继承的,新式类是按照广度优先继承的
Python3 经典类和新式类都是按照广度优先来继承
当继承多个父类时,多个父类构造函数的参数个数必须相同,否则会报错。
class animal(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def eat(self):
        print("animal is eating")
        self.num = 5

class person(object):
    def __init__(self, name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("person is eating")
        self.num = 10
class Man(person,animal):
    def __init__(self, name, age,money): ###python3 init时会按照广度优先
        super(Man,self).__init__(name, age)  ##使用super多继承
        self.money=money

    ###子类复写父类方法
    def eat(self):
        super().eat()  ##对父类重写时,只能通过super方法来调用父类的方法。正在重写时,无法通过self调用
        self.num+=3
    ###子类调用父类方法
    def big_eat(self):
        self.eat()  ##使用self调用子类的方法,如果子类重写了父类的方法,会调用重写后的方法,没有的话就调用父类的方法。


m1=Man("paul",'22','500')
m1.big_eat()
#>>>person is eating
print(m1.num)
#>>13

  

综合练习:

class SchoolMember(object):
    members = 0  # 初始学校人数为0

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

    def tell(self):
        pass

    def enroll(self):
        '''注册'''
        SchoolMember.members += 1
        print("\033[32;1mnew member [%s] is enrolled,now there are [%s] members.\033[0m " % (
        self.name, SchoolMember.members))

    def __del__(self):
        '''析构方法'''
        print("\033[31;1mmember [%s] is dead!\033[0m" % self.name)


class Teacher(SchoolMember):
    def __init__(self, name, age, course, salary):
        super(Teacher, self).__init__(name, age)
        self.course = course
        self.salary = salary
        self.enroll()

    def teaching(self):
        '''讲课方法'''
        print("Teacher [%s] is teaching [%s] for class [%s]" % (self.name, self.course, 's12'))

    def tell(self):
        '''自我介绍方法'''
        msg = '''Hi, my name is [%s], works for [%s] as a [%s] teacher !''' % (self.name, 'Oldboy', self.course)
        print(msg)


class Student(SchoolMember):
    def __init__(self, name, age, grade, sid):
        super(Student, self).__init__(name, age)
        self.grade = grade
        self.sid = sid
        self.enroll()

    def tell(self):
        '''自我介绍方法'''
        msg = '''Hi, my name is [%s], I'm studying [%s] in [%s]!''' % (self.name, self.grade, 'Oldboy')
        print(msg)


if __name__ == '__main__':
    t1 = Teacher("Alex", 22, 'Python', 20000)
    t2 = Teacher("TengLan", 29, 'Linux', 3000)

    s1 = Student("Qinghua", 24, "Python S12", 1483)
    s2 = Student("SanJiang", 26, "Python S12", 1484)

    t1.teaching()
    t2.teaching()
    t1.tell()