python中的繼承、多繼承、超繼承


【繼承】

#父類有的,繼承后子類可以直接調用
#父類子類都有同一個重名函數,優先子類調用自己的
#父類只能調用自己的函數
class RobotOne:
    def __init__(self,year,name):
        self.year=year
        self.name=name
    def walking_on_ground(self):
        print(self.name+'只能在平地上行走,有障礙物會摔倒')
    def robot_info(self):
        print('{0}年產生的機器人{1}是中國研發的'.format(self.year,self.name))

class RobotTwo(RobotOne):   #繼承,二代繼承了一代
    def walking_on_ground(self):
        print(self.name+'可以在平地上平穩的行走')
    def walking_avoid_block(self):  #函數拓展:繼承下,子類獨有的
        #我想在子類函數里調用父類的一個函數,可以直接:
        #self.robot_info()
        print(self.name+'可以避開障礙物')

#繼承的類是否要用到初始化函數,看是否是從父類里繼承的
t2=RobotTwo(1990,'小王')    #必傳參
t2.walking_avoid_block()    #重寫:子類里面的函數名與父類函數名重復時叫重寫
t2.robot_info()         #二代可以調用1代的方法
t1=RobotOne(1988,'小明')
t1.walking_on_ground()
 
         
         
        

【多繼承】

1.有兩個父類的屬性和方法,如果兩個父類具有同名方法時候,調用就近原則(就近類名的那個),初始化函數也包括在內

 

class RobotOne:
    def __init__(self,year,name,height):
        self.year=year
        self.name=name
        self.height=height
    def walking_on_ground(self):
        print(self.name+'只能在平地上行走,有障礙物會摔倒')
    def robot_info(self):
        print('{0}年產生的機器人{1},身高{2}是中國研發的'.format(self.year,self.name,self.height))

class RobotTwo:
    def __init__(self,year):
        self.year=year
    def walking_on_ground(self):
        print(self.name+'可以在平地上平穩的行走')
    def walking_avoid_block(self):  #函數拓展:繼承下,子類獨有的
        print(self.name+'可以避開障礙物')
class RobotThree(RobotOne,RobotTwo):    #三代同時繼承一代/二代,調用就近選擇
    def jump(self):
        print(self.name+'可單膝跳躍')

#繼承的類是否要用到初始化函數,看是否是從父類里繼承的
t3=RobotThree(1950,'大王',100)    #創建第三代實例
t3.jump()
t3.walking_on_ground() #同時繼承一代和二代同名函數,會調用就近選擇

(2)替換三代里繼承的一代和二代的位置:

class RobotOne:
    def __init__(self,year,name,height):
        self.year=year
        self.name=name
        self.height=height
    def walking_on_ground(self):
        print(self.name+'只能在平地上行走,有障礙物會摔倒')
    def robot_info(self):
        print('{0}年產生的機器人{1},身高{2}是中國研發的'.format(self.year,self.name,self.height))

class RobotTwo:
    def __init__(self,name):
        self.name=name
    def walking_on_ground(self):
        print(self.name+'可以在平地上平穩的行走')
    def walking_avoid_block(self):  #函數拓展:繼承下,子類獨有的
        print(self.name+'可以避開障礙物')
class RobotThree(RobotTwo,RobotOne):    #三代同時繼承二代和一代,調用就近選擇
    def jump(self):
        print(self.name+'可單膝跳躍')

#繼承的類是否要用到初始化函數,看是否是從父類里繼承的
t3=RobotThree(1950,'大王',100)    #創建第三代實例
t3.jump()
t3.walking_on_ground()
#輸出報錯1:
Traceback (most recent call last):
  File "/Users/tuyoo/Documents/pytext/test02/other_file/a_02.py", line 55, in <module>
    t3=RobotThree(1950,'大王',100)    #創建第三代實例
TypeError: __init__() takes 2 positional arguments but 4 were given  #改為‘大王’就好了
#輸出報錯2(調用初始化函數)
/usr/local/bin/python3.7 /Users/tuyoo/Documents/pytext/test02/other_file/a_02.py
Traceback (most recent call last):
  File "/Users/tuyoo/Documents/pytext/test02/other_file/a_02.py", line 56, in <module>
    t3.robot_info()
  File "/Users/tuyoo/Documents/pytext/test02/other_file/a_02.py", line 41, in robot_info
    print('{0}年產生的機器人{1},身高{2}是中國研發的'.format(self.year,self.name,self.height))
AttributeError: 'RobotThree' object has no attribute 'year'
#替換為三代繼承二代,初始化函數形參數不同的情況下,t3在調用RobotOne中的robot_info,沒有year參數時候會報錯,要避免
#原因:robot_info在一代函數里,而由於取就近原則取的二代,導致自相矛盾
#解決:避免 或者重寫


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM