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("\t",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在 元素作为多继承。

 

 

posted @ 2017-11-10 16:10  kevin.Xiang  阅读(539)  评论(0编辑  收藏  举报