9 面向物件基礎(二)
阿新 • • 發佈:2018-11-12
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__)