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

继承:

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

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类的所有属性和方法

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.对父类方法进行扩展

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

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

多继承
    子类拥有一个父类叫作单继承
    子类可以拥有多个父类,并且具有所有父类的属性和方法
    例如:孩子会继承自己父亲和母亲的特征

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)


私有属性和私有方法:

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. 退出

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

猜你喜欢

转载自blog.csdn.net/qq_42711214/article/details/82714550