1.26 Python知识进阶 - 继承

继承

  继承(Inheritance)是面向对象的程序设计中代码重要的主要方法。继承是允许使用现有类的功能,并在无需重新改写原来的类的情况下,对这些功能进行扩展。继承可以避免代码复制和相关的代码维护等问题。

  被继承的类称为“基类(Base Class)”、“父类” 或 “超类(Super Class)”,通过继承创建的新类称为“子类(Subclass)” 或 “派生类(Derived Class)”。

  声明格式:

    class 派生类(基类1,[基类2,...]):

      类体

  其中,派生类名后为所有基类的名称元组。如果在类定义中没有指定基类,则默认其基类为objec。object是所有对象的根基类。

  多个类的继承可以形成层次关系,通过类的方法mro()或类的属性__mro__可以输出其继承的层次关系。例如:

class A: pass

class B(A): pass

class C(B): pass

class D(A): pass

class E(B, D): pass

print(D.mro())
print(E.__mro__)
------------------line----------------------
[<class ‘__main__.D‘>, <class ‘__main__.A‘>, <class ‘object‘>] (<class ‘__main__.E‘>, <class ‘__main__.B‘>, <class ‘__main__.D‘>, <class ‘__main__.A‘>, <class ‘object‘>)

  声明派生类时,必须在其构造函数中调用基类的构造函数。调用格式:

    基类名.__init__(self,参数列表)

  定义一个Car类,再定义一个ElectricCar类,让其继承Car类属性和方法,示例代码:

class Car(object):
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = str(self.year) + ‘ ‘ + self.make + ‘ ‘ + self.model
        return long_name.title()

    def read_odometer(self):
        print("This car has " + str(self.odometer_reading) + "miles on it.")

    def update_odometer(self, mileage):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can‘t roll back an odometer!")

    def increment_odometer(self, miles):
        self.odometer_reading += miles

class ElectricCar(Car):
    def __init__(self, make, model, year):
        Car.__init__(self, make, model, year)

my_tesla = ElectricCar(‘tesla‘, ‘model s‘, 2016)
print(my_tesla.get_descriptive_name())
------------------line----------------------
2016 Tesla Model S

  这里Car就是ElectricCar的“父类” 或 “超类”, ElectricCar就是Car的“子类” 或 “派生类”。

  代码“Car.__init__(self, make, model, year)”,让Python通过调用Car类中的__init__(),让ElectricCar实例包含父类的所有属性。

  让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法,为电动汽车添加特有的属性(电瓶)。示例代码:

class Car(object):
    -- snip --

class ElectricCar(Car):
    def __init__(self, make, model, year):
        Car.__init__(self, make, model, year)
        self.battery_size = 70

    def describe_battery(self):
        print("This car has a " + str(self.battery_size) + "-kWH battery.")

my_tesla = ElectricCar(‘tesla‘, ‘model s‘, 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
------------------line----------------------
2016 Tesla Model S
This car has a 70-kWH battery.

  有的时候父类的一些方法可能不子类的一些特性,我们需要对父类的方法重新构造,我们可在子类中重新定义一个这样的方法,即与要重写的父类的方法同名。假如Car类中有fill_gas_tank()方法,我们在ElectricCar中重构。示例代码:

class ElectricCar(Car):
    -- snip --

    def fill_gas_tank(self):
        print("This car does‘t need a gas tank!")

  记住,先继承,再重构。

  

  Python支持多重继承,即一个派生类可以继承多个基类。

  多个类的继承可以形成层次关系,通过类的方法mro()或类的属性__mro__可以输出其继承的层次关系。例如:

class A: pass

class B(A): pass

class C(B): pass

class D(A): pass

class E(B, D): pass

print(D.mro())
print(E.__mro__)
------------------line----------------------
[<class ‘__main__.D‘>, <class ‘__main__.A‘>, <class ‘object‘>](<class ‘__main__.E‘>, <class ‘__main__.B‘>, <class ‘__main__.D‘>, <class ‘__main__.A‘>, <class ‘object‘>)


  附1,练习代码:

class SchoolMember(object):
    members = 0

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

    def enroll(self):
        print("just enrolled a school member [%s] ." % self.name)
        SchoolMember.members += 1

    def tell(self):
        print("------%s info------" % self.name)
        for k,v in self.__dict__.items():
            print("\t",k,v)

    def __del__(self):
        print("开除了[%s]..." % self.name)
        SchoolMember.members += 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 teaching(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
        self.amount = 0

    def pay_tuition(self, amount):
        print("Student [%s] has just paied [%s]."  % (self.name, amount))
        self.amount += amount

t1 = Teacher("Alex", 33, "M", 2000, "Python")
s1 = Student("John", 20, "M", "Python", 30000)


  附2,关于新旧类的问题:

  写法1,又称经典类写法:

    基类名.__init__(self,基类中的属性) 

  写法2,又称新式类写法:

    Python 2.7中:

    super(子类名,self).__init__(基类中的属性)

    Python 3.x中:

    super().__init__(基类中的属性)

  注:在Python 2.7中使用继承时,务必在定义父类时在括号内指定object。

  

时间: 2024-12-15 16:41:03

1.26 Python知识进阶 - 继承的相关文章

1.25 Python知识进阶 - 封装

示例代码: class Role(object): count = 0 def __init__(self,name,role,weapon,life_value=100,money=15000): self.name = name self.role = role self.weapon = weapon  self.life_value = life_value self.money = money self.__heart = "normal" def shot(self): p

Python爬虫进阶五之多线程的用法

前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread 库,一个是 multiprocessing 库.而多线程 thread 在 Python 里面被称作鸡肋的存在!而没错!本节介绍的是就是这个库 thread. 不建议你用这个,不过还是介绍下了,如果想看可以看看下面,不想浪费时间直接看 multiprocessing 多进程 鸡肋点 名言: "Pyt

python yield 进阶(二)

PS:接上一篇 本文摘自OSchina Linuxqueen 不幸的是,这样做看上去似乎不太可能.即使是我们有神奇的函数,可以让我们从n遍历到无限大,我们也会在返回第一个值之后卡住: 1 def get_primes(start): 2     for element in magical_infinite_range(start): 3         if is_prime(element): 4             return element 假设这样去调用get_primes: 1

Python爬虫进阶一之爬虫框架概述

综述 爬虫入门之后,我们有两条路可以走. 一个是继续深入学习,以及关于设计模式的一些知识,强化Python相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展.另一条路便是学习一些优秀的框架,先把这些框架用熟,可以确保能够应付一些基本的爬虫任务,也就是所谓的解决温饱问题,然后再深入学习它的源码等知识,进一步强化. 就个人而言,前一种方法其实就是自己动手造轮子,前人其实已经有了一些比较好的框架,可以直接拿来用,但是为了自己能够研究得更加深入和对爬虫有更全面的了解,自己动手去多做.

面向对象的进阶-------继承

初始面向对象之后,我们来学习面向对象的三大特性以及面向对象的其他补充方面的知识.   继承         定义:继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又叫做基类或超类,新建的类被称为派生类或子类.      python中类的继承可以分为单继承和多继承 查看继承的方法是_base_ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类 注:如果没有指定基类,python中的类会默认继承object类,object类

python yield 进阶(一)

PS:硬说原创 我只能说自己太不要脸了 就当是个搬运工吧 希望对您有帮助 先来看看基础的---重头戏在后面: yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法. 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist(alist): for i in alist: yield i + 1 取出alist的每一项,然后把i + 1塞进去.然后通过调用取出每一项: alist = [1, 2, 3, 4] f

Python爬虫进阶二之PySpider框架安装配置

关于 首先,在此附上项目的地址,以及官方文档 PySpider 官方文档 安装 1. pip 首先确保你已经安装了pip,若没有安装,请参照 pip安装 2. phantomjs PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速.原生支持各种Web标准:DOM 处理.CSS 选择器.JSON.Canvas 和 SVG. PhantomJS 可以用于页面自动化.网络监测.网页截屏以及无界面测试等. 安装 以上附有官方安

Python爬虫进阶三之Scrapy框架安装配置

初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 Win7,首先,你要有Python,我用的是2.7.7版本,Python3相仿,只是一些源文件不同. 官网文档:http://doc.scrapy.org/en/latest/intro/install.html,最权威哒,下面是我的亲身体验过程. 1.安装Python 安装过程我就不多说啦,我的电

Python知识总结

Python知识总结 一.python简介 1.Python简介 Python是一种解释型.交互式.面向对象.是初学者的语言. 2.python特点 ①易于学习 ②易于阅读 ③易于维护 ④一个广泛的标准库 ⑤互动模式 ⑥便携式 ⑦可扩展 ⑧数据库 ⑨GUI编程 ⑩可扩展性 3.python支持tab补全功能: >>> import readline,rlcompleter >>> readline.parse_and_bind('tab: complete') 可以将上