您的位置:首页 > 编程语言 > Python开发

python面向对象特征(二)继承

2018-09-15 15:40 155 查看

继承:

封装:根据职责将属性和方法封装到一个抽象的类中
继承:实现代码的重用,相同的代码不需要重复的写

[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()

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: