python面向对象特征(二)继承
继承:
封装:根据职责将属性和方法封装到一个抽象的类中
继承:实现代码的重用,相同的代码不需要重复的写
[code]class Animal: def eat(self): print '吃' def drink(self): print '喝' def run(self): print '跑' def sleep(self): print '睡' class Cat(Animal): # 子类拥有父类的所有属性和方法 def call(self): print '喵喵~' fentiao = Cat() fentiao.eat() fentiao.drink() fentiao.run() fentiao.sleep() fentiao.call() # 子类继承自父类,可以直接享受父类中已经封装好的方法
继承的传递性(爷爷 爸爸 儿子)
1.C 类从B类继承 ,B类又从A类继承
2.那么C类就具有B类和A类的所有属性和方法
[code]class Animal: def eat(self): print '吃' def drink(self): print '喝' def run(self): print '跑' def sleep(self): print '睡' class Cat(Animal): # 子类拥有父类的所有属性和方法 def call(self): print '喵喵~' class Hellokitty(Cat): def speak(self): print '我可以说日语' # 创建一个Hellokitty对象 kt = Hellokitty() kt.speak() kt.call() # 继承的传递性 子类拥有父类的父类的属性和方法 kt.eat() kt.drink() kt.sleep() kt.run()
方法的重写
1.覆盖父类的方法(重写父类方法)
2.对父类方法进行扩展
[code]class Animal: def eat(self): print '吃' def drink(self): print '喝' def run(self): print '跑' def sleep(self): print '睡' class Cat(Animal): # 子类拥有父类的所有属性和方法 def call(self): print '喵喵~' class Hellokitty(Cat): def speak(self): print '我可以说日语' def call(self): # 1.针对子类特有的需求,编写代码 print '欧哈呦~空你起哇' # 2.调用原本子阿父类中封装的方法 Cat.call(self) #3.增加其他子类代码 print '@$@!$#@!$!#' kt =Hellokitty() # 如果子类中,重写了父类的方法 # 在运行中,只会调用在子类中重写的方法而不会调用父类的方法 kt.call()
[code]class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaaa~' self.hungry =False else: print 'No Thanks~' class SongBird(Bird): def __init__(self): self.sound = 'Squawk!' Bird.__init__(self) def sing(self): print self.sound bird = Bird() bird.eat() littlebird = SongBird() littlebird.eat() littlebird.sing()
多继承
子类拥有一个父类叫作单继承
子类可以拥有多个父类,并且具有所有父类的属性和方法
例如:孩子会继承自己父亲和母亲的特征
[code]class A: def test(self): print 'A---------test 方法' def demo(self): print 'A--------demo方法' class B: def test(self): print 'B -------test方法' def demo(self): print 'B ---------demo 方法' class C(B,A): """多继承可以让子类对象,同时具有多个父类的属性和方法""" pass # 创建子类对象 c = C() c.test() c.demo()
新式类和旧式(经典)类:
object是Python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看
新式类:以object为基类的类,推荐使用
经典类:不以object为基类的类,不推荐使用
在python3.X中定义的类时,如果没有指定父类,会默认使用object作为基类--python3.x中定义的类都是新式类
在python2.x中定义类时,如果没有指定父类,则不会以object作为基类
####推荐使用新式类#############
新式类和旧式类在多继承时---会影响到方法的搜索顺序
为保证编写的代码能够同时在python2.x和python3.x运行
今后在定义类时,如果没有父类,建议统一继承自object
>>> class A(object):
... pass
...
>>> a = A()
>>> dir(a) #查看内置的属性和方法
---------------------------------------------------
>>> class B:
... pass
...
>>> b=B()
>>> dir(b)
私有属性和私有方法:
[code]class A(object): def __init__(self): self.num1 = 100 # 定义私有属性 self.__num2 = 200 def __text(self): print '私有方法 %d %d' %(self.num1,self.__num2) def test(self): print '父类的私有方法 %d' %self.__num2 self.__text() class B(A): def demo(self): # 在子类的对象方法中,不能访问父类的私有属性 #print '访问父类的私有属性 %d' %self.__num2 # 在子类的对象方法中,不能调用父类的私有方法 #self.__test() print '子类方法 %d' %self.num1 self.test() # 创建一个子类对象 b = B() print b # 在子类方法的内部能访问父类的公有属性和调用父类的公有方法 b.demo() # 在外界访问父类的公有属性和调用公有方法 print b.num1 # 在外界不能直接访问对象的私有属性/调用私有方法 # print b.__num2 # b.__test()
综合练习:
图书管理系统
1. 查询所有书籍
2. 增加书籍
3. 借出书籍
4. 归还书籍
5. 退出
[code]class Book(object): def __init__(self, name, author, state, bookIndex): self.name = name self.author = author # 0:借出 1:未借出 self.state = state self.bookIndex = bookIndex def __str__(self): stat = '已借出' if self.state == 1: stat = '未借出' return '书名:%s 作者%s 状态:%s 位置:%s' %(self.name,self.author,self.state,self.bookIndex) class BookManger(object): books = [] def start(self): """图书管理初始化""" b1 = Book('python', 'Guido', 1, "INS888") self.books.append(b1) self.books.append(Book('java', 'hello', 1, "IGS888")) self.books.append(Book('c', 'westos', 1, "INS880")) def Menu(self): self.start() while True: print(""" 图书管理系统 1. 查询 2. 增加 3. 借阅 4. 归还 5. 退出 """) choice = raw_input("Choice:") if choice == "1": pass elif choice == '2': self.addBook() elif choice == '3': self.borrowBook() else: print "清输入正确的选择!" def addBook(self): name = raw_input("书名:") self.books.append(Book(name, raw_input("作者:"), 1, raw_input("书籍位置:"))) print "添加图书%s成功!" % name def borrowBook(self): name = raw_input("借阅书籍名称:") ret = self.checkBook(name) if ret != None: if ret.state == 0: print "书籍《%s》已经借出" % (name) else: ret.state = 0 print "借阅%s成功" % (name) else: print "书籍《%s》不存在!" % (name) def checkBook(self, name): """查找书籍是否存在""" for book in self.books: # book: Book类创建的对象 # book.name; if book.name == name: # 返回book对象 return book else: return None bookManage = BookManger() bookManage.Menu()
阅读更多
- 我与python约个会:25. 企业级开发基础6:面向对象特征(继承)
- 面向对象第二个特征----继承II(什么时候使用继承)
- 面向对象第二个特征----继承III(子父类中的构造函数)
- 设计模式学习(一):java 面向对象特征:抽象、封装、多态、继承
- 我与python约个会:26. 企业级开发基础7:面向对象特征(多态)
- c++基础 之 面向对象特征一 : 继承
- 面向对象第二个特征----继承II(什么时候使用继承)
- Python 面向对象(二)类的继承
- 黑马程序员 面向对象特征 封装、继承、多态总结
- 面向对象第九课,面向对象三大基本特征,继承,Object用法,toString和equals方法
- 面向对象第二个特征----继承III(子父类中的构造函数)
- 面向对象第二个特征----继承II(什么时候使用继承)
- 0809 Java面向对象特征之继承
- 06、面向对象特征之继承
- Python面向对象之继承
- 面向对象的设计的三大特征:一. 继承
- 面向对象第二个特征----继承III(子父类中的构造函数)
- Java面向对象(二)面向对象的特征 --- 封装 、 继承、 多态
- python 面向对象多继承和多态
- Python面向对象程序设计之继承与多继承用法分析