1. 程式人生 > >9 面向物件基礎(二)

9 面向物件基礎(二)

9.1應用:存放傢俱

"""

存放傢俱:往家裡面存放傢俱(床), 要考慮到家裡的剩餘的可用面積
"""


class Home(object):

    def __init__(self, area):
        self.area = area    # self.area 表示家裡剩餘的可用面積
        self.items = []    # 用來存放傢俱物件

    def __str__(self):
        names = []  # 來存放self.items列表中物件的name屬性

        for i in self.items:
            names.append(i.name)

        return "家裡面存放的傢俱有%s,家裡剩餘可用面積為:%s" % (names, self.area)

    def add_sth(self, obj):
        # print(obj)
        if self.area > obj.area:
            self.items.append(obj)
            # self.area = self.area - 床的面積
            self.area = self.area - obj.area


class Bed(object):

    def __init__(self, area, name):
        self.area = area  # self.area指的是床的佔地面積
        self.name = name

my_home = Home(150)  # 建立物件

bed = Bed(4, "雙人床")    # 建立物件
bed02 = Bed(3, "單人床")    # 建立物件
bed03 = Bed(2, "嬰兒床")    # 建立物件

my_home.add_sth(bed)   # 存傢俱
my_home.add_sth(bed02)   # 存傢俱
print(my_home)
my_home.add_sth(bed03)
print(my_home)

9.2 繼承

"""
單繼承: 一個類繼承與另外一個類   A類繼承與B類

class 子類名(父類名):  # 讓Dog這個類繼承與Animal這個類

python2:
class Animal():   經典類(舊式類)
class Animal(object):   新式類

python3中推薦的寫法:
class Animal(object):
class Animal:
"""


class Animal(object):   # 父類、基類

    def eat(self):
        print("--吃--")

    def drink(self):
        print("--喝--")


class Dog(Animal):  # 子類、派生類   讓Dog這個類繼承與Animal這個類,子類就具有了父類的一些方法
    # pass
    # def eat(self):
    #     print("--吃--")
    #
    # def drink(self):
    #     print("--喝--")
    def say(self):
        print("--旺旺--")

xtq = Dog()
xtq.eat()
xtq.drink()
xtq.say()

9.3 單繼承

9.4多層繼承

"""
多層繼承: C繼承與B,B又繼承與A
C類的物件能夠呼叫B類和A類的方法

python2:
class Animal():   經典類(舊式類)
class Animal(object):   新式類

python3中推薦的寫法:
class Animal(object):
class Animal:
"""


class Animal(object):   # 父類、基類

    def eat(self):
        print("--吃--")

    # def drink(self):
    #     print("--喝--")


class Dog(Animal):  # 子類、派生類   讓Dog這個類繼承與Animal這個類,子類就具有了父類的一些方法
    # pass
    # def eat(self):
    #     print("--吃--")
    #
    def drink(self):
        print("--喝--")


class Xtq(Dog):
    def say(self):
        print("--旺旺--")

xtq = Xtq()
xtq.say()
xtq.drink()
xtq.eat()

9.5 多繼承

"""

多繼承: C類同時繼承與A類和B類
"""


class A(object):

    def eat(self):
        print("---吃---")

    def drink(self):
        print("---A喝---")


class B(object):

    def drink(self):
        print("---B喝---")


class C(A, B):
    def drink(self):
        # B.drink(self)
        super(A, self).drink()
        print("---C喝---")

c = C()
c.drink()

print(C.__mro__)

9.6子類重寫父類同名屬性和方法

"""
多層繼承: C繼承與B,B又繼承與A
C類的物件能夠呼叫B類和A類的方法

python2:
class Animal():   經典類(舊式類)
class Animal(object):   新式類

python3中推薦的寫法:
class Animal(object):
class Animal:
"""


class Animal(object):   # 父類、基類

    def eat(self):
        print("--Animal吃--")

    # def drink(self):
    #     print("--喝--")


class Dog(Animal):  # 子類、派生類   讓Dog這個類繼承與Animal這個類,子類就具有了父類的一些方法
    # pass
    def eat(self):
        print("--Dog吃--")

    def drink(self):
        print("--喝--")

    def say(self):
        print("--旺旺--")


class Xtq(Dog):

    def say(self):  # 重寫的概念:子類的方法名和父類的方法名一致的時候,我們就說子類重寫了父類的方法
        # 重寫的特點:子類的物件呼叫這個方法的時候,執行的子類的方法
        print("--吼吼--")

    # def eat(self):
    #     print("--xtq吃--")
xtq = Xtq()
xtq.say()
xtq.drink()
xtq.eat()
print(Xtq.__mro__)    # 類名.__mro__ 描述的是,和這個類有繼承關係的一些類,作為每一個元素以元組的方式展示

9.7子類呼叫父類同名屬性和方法

"""
# 有3種格式來呼叫重寫了的父類方法
# Dog.say(self)    # 父類名.方法名(self)
# super().say()    # super().方法名()
# super(Xtq, self).say()   
 super(指定一個類名, self).方法名()
指定一個類名:呼叫的就是這個指定類的上一級(上一級就是Xtq.__mro__中後面的一個類)的類的方法
"""


class Animal(object):   # 父類、基類

    def eat(self):
        print("--Animal吃--")

    # def drink(self):
    #     print("--喝--")


class Dog(Animal):  # 子類、派生類   讓Dog這個類繼承與Animal這個類,子類就具有了父類的一些方法
    # pass
    def eat(self):
        print("--Dog吃--")

    def drink(self):
        print("--喝--")

    def say(self):
        print("--旺旺--")


class Xtq(Dog):

    def say(self):
        # 有3種格式來呼叫重寫了的父類方法
        # Dog.say(self)    # 父類名.方法名(self)
        # super().say()    # super().方法名()
        # super(Xtq, self).say()    super(Xtq, self).方法名()
        # super(Dog, self).eat()    # super(Xtq, self).方法名()
        print("--吼吼--")


xtq = Xtq()
xtq.say()
print(Xtq.__mro__)