zoukankan      html  css  js  c++  java
  • Python 继承

    Python 继承

    类的继承(一)

    继承

    面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

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

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

    继承的过程,就是从一般到特殊的过程。

    要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

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

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

    Ø         实现继承是指使用基类的属性和方法而无需额外编码的能力;

    Ø         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);

    在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

     

    抽象类仅定义将由子类创建的一般属性和方法。

    OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

     

    继承示例(1)

    #BlackPerson类 继承 Person类
    
    #动作:
    
    #BlackPerson可调用Person的talk方法
    
    class Person(object):
    
      def talk(self):
    
        print("person is talking...l")
    
     
    
    class BlackPerson(Person):
    
      pass
    
     
    
    b = BlackPerson()
    
    b.talk()
    
    #输出结果
    
    #person is talking...l

     

     

    继承示例(2)

    #BlackPerson类 继承 Person类
    
    #动作:
    
    #BlackPerson继承 新增方法walk
    
    #BlackPerson继承 重写父类talk
    
    class Person(object):
    
      def talk(self):
    
        print("person is talking...1")
    
     
    
    class BlackPerson(Person):
    
      def talk(self):
    
        print("person is talking...2")
    
     
    
      def walk(self):
    
        print("is walking....")
    
     
    
    b = BlackPerson()
    
    b.talk()
    
    b.walk()
    
    #输出结果
    
    #person is talking...2
    
    #is walking....

     

    继承式列(3)

    ------------------------------------------------------------------------------------------------------------------------

    #BlackPerson类 WhitePerson 类 继承 Person类
    #动作1:
    #Person父类 添加name,age元素
    #注:父类添加元素后,对象也许添加元素否则报错
    #
    #动作2:
    #BlackPerson类新建构造函数,并继承父类构建函数,先继承后重组。
    #注:子类需要有父类构造函数内的元素,后可新建元素,调用父类
    #    成员属性下,添加构造函数。
    #
    #原理: #注:如图1,当子类函数,获取到name,age元素时,会传给下面父类的 # 子类元素,父类获取到子类元素会把传到的值,划分给构建函数内的 # 成员属性,完成先继承后重组的步骤。
    #
    #动作3:
    #注:在子类继承父类后,可新建自己类的成员属性
    #
    #动作4:
    #子类方法下也可使用父类的继承方法
    #注:父类.方法(self) 但这样做没有意义。

    
    class Person(object):
    
        def __init__(self,name,age):
            self.name = name   #self = b self.name = b.name
            self.age = age
            self.sex = "noraml"
        def talk(self):
            print("person is talking...1")
    
    class BlackPerson(Person):
    
        def __init__(self,name,age ,strength): #先继承,在重构(动作1)
            Person.__init__(self,name,age)   #父类调用子类元素(动作2)
         self.strength = tering        #继承父类后可调用自己的成员元素(动作3)


      def talk(self):
         Person.tslk(self)           #调用父类方法(动作4)
    print("person is talking...2")       def walk(self): print("is walking....") b = BlackPerson("Kevin","22") class WhitePerson(Person): pass

     

    ------------------------------------------------------------------------------------------------------------------------

     

    类的继承(二)

     实战案例

    class SchoolMember(object): #基类
        '''学校成员基类'''
        member = 0  #注册成员数
        def __init__(self,name,age,sex):   #基类构造函数
            self.name = name
            self.age = age
            self.sex = sex
            self.enroll()   #注册方法,直接调用给子类
    
        def enroll(self): #注册成员,每多出一个对象就+1
            '''注册'''
            print("just enrolled a new school member [%s]"%self.name)
            SchoolMember.member += 1
    
        def tell(self):     #问题2.在不改写子类的情况下,通过基类打印,不同子类的信息。
            """循环打印人员信息"""
            print("-------info:%s---------"%self.name)
            for k,v in self.__dict__.items():
                print("	",k,v)
    
        def __del__(self):  #问题1,删除成员后自动减注册表。
            '''析构函数,开除一个人后注册表-1'''
            print("开除了[%s]..."%self.name)
            SchoolMember.member -=1     #每有一个对象删除就减1
    
    
    class Teacher(SchoolMember):    #子类
        '''讲师类'''
    
        def __init__(self,name,age,sex,salary,course):  #包含基类并新建元素
            SchoolMember.__init__(self,name,age,sex)    #继承基类构造
            self.salary = salary
            self.course = course
    
    
        def teching(self):  #方法
            print("Teacher[%s] is teaching [%s]"%(self.name,self.course))
    
    
    class Student(SchoolMember):    #子类
        """学生"""
        def __init__(self,name,age,sex,course,tuition): #包含基类并新建元素
            SchoolMember.__init__(self,name,age,sex)    #继承基类构造
            self.course = course
            self.tuition = tuition #fee学费
    
        def pay_tuition(self,amount):
            print("student [%s] has just paied [%s]"%(self.name,amount))
            self.amount += amount
    
    
    t1 = Teacher("Wusir","28","F*M","8000","Python")
    s1 = Student("HaiTao","38","N/A","PYS15",300000)
    s2 = Student("LiChuang",12,"M","PYS15",11000)
    
    print(t1.__dict__)  #打印变量t1的元素信息。
    
    
    #问题2.在不改写子类的情况下,通过基类打印,不同子类的信息。
    # t1.tell()
    # s1.tell()
    #执行结果
    # -------info:Wusir---------
    #      name Wusir
    #      age 28
    #      sex F*M
    #      salary 8000
    #      course Python
    #
    # -------info:HaiTao---------
    #      name HaiTao
    #      age 38
    #      sex N/A
    #      course PYS15
    #      tuition 300000
    
    
    
    
    #问题1,删除成员后自动减注册表。
    # import time
    # del s2
    # print(SchoolMember.member)
    # time.sleep(5)
    #执行结果:
    # 开除了[LiChuang]...
    #2
    #开除了[Wusir]...
    #开除了[HaiTao]...

    注:析构函数,程序执行完毕后会自动输出。

     

     类的继承(三)

     

    继承写法

     

    SchoolMember.__init__(self,name,age,sex) #经典类

     

    super(Teacher, self).__init__(name,age,sex) #新式类

     

     

     

    多继承

    class School(object): #多继承类
    
    
      '''学校类'''
    
    
      def info(self,addr):
    
    
        print("%s 6666666666666666"%addr)
    
    
     
    
    class Teacher(SchoolMember,School): #多继承
    
    
      '''讲师类'''
    
    
      def __init__(self,name,age,sex,salary,course): #包含基类并新建元素
    
    
    SchoolMember.__init__(self,name,age,sex) #继承基类构造

    #执行结果

    #BJ 6666666666666666

    School在 元素作为多继承。

     

     

  • 相关阅读:
    android模拟器EditText 不能用物理键盘输入,也不能用电脑键盘输入
    Java中HashMap遍历的两种方式
    Android平台下基于XMPP的IM研究
    基于MINA框架快速开发网络应用程序
    Java中ArrayList遍历的4种方法
    Java在ACM中的应用
    Java大数
    zoj 1406 Jungle Roads
    hdoj 1009 FatMouse' Trade
    Action 相关组件
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/7815182.html
Copyright © 2011-2022 走看看