欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python3.5面向?qū)ο蟪绦蛟O計之類的繼承和多態(tài)詳解

 更新時間:2019年04月24日 11:01:23   作者:loveliuzz  
這篇文章主要介紹了Python3.5面向?qū)ο蟪绦蛟O計之類的繼承和多態(tài),結(jié)合實例形式詳細分析了Python3.5面向?qū)ο蟪绦蛟O計中類的繼承與多態(tài)常見用法及相關(guān)注意事項,需要的朋友可以參考下

本文實例講述了Python3.5面向?qū)ο蟪绦蛟O計之類的繼承和多態(tài)。分享給大家供大家參考,具體如下:

1、繼承的定義

繼承是指:可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
(1)通過繼承創(chuàng)建的新類稱為“子類”或“派生類”。
(2)被繼承的類稱為“基類”、“父類”或“超類”。
繼承的過程,就是從一般到特殊的過程。要實現(xiàn)繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現(xiàn)。
在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現(xiàn)多重繼承,可以通過多級繼承來實現(xiàn)。

2、繼承的分類

繼承概念的實現(xiàn)方式主要有2類:實現(xiàn)繼承、接口繼承。

(1) 實現(xiàn)繼承是指使用基類的屬性和方法而無需額外編碼的能力;
  (2)接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現(xiàn)的能力(子類重構(gòu)父類方法);
在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關(guān)系應該是“屬于”關(guān)系。
抽象類僅定義將由子類創(chuàng)建的一般屬性和方法。
OO開發(fā)范式大致為:劃分對象→抽象類→將類組織成為層次化結(jié)構(gòu)(繼承和合成) →用類與實例進行設計和實現(xiàn)幾個階段。

3、示例代碼

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#類的繼承
class People:
 def __init__(self,name,age):
  self.name = name
  self.age = age

 def eat(self):
  print("%s is eating..." %self.name)

 def sleep(self):
  print("%s is sleeping..." %self.name)

 def talk(self):
  print("%s is talking..." %self.name)

class Man(People):  #繼承父類People類
 def make_money(self):
  print("%s is making money..." %self.name)

 def sleep(self):
  People.sleep(self)  #對父類方法的擴展
  print("man is sleeping...")

class Women(People):
 def shop(self):
  print("%s is shopping..." %self.name)

m1 = Man("Jack","20")
m1.eat()
m1.make_money()
m1.sleep()

w1 = Women("Amy","25")
w1.talk()
w1.shop()

運行結(jié)果:

Jack is eating...
Jack is making money...
Jack is sleeping...
man is sleeping...
Amy is talking...
Amy is shopping...

4、子類中對父類的構(gòu)造函數(shù)進行重構(gòu)兩種方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#類的繼承
#class People:  #經(jīng)典類
class People(object):  #新式類
 def __init__(self,name,age):
  self.name = name
  self.age = age

 def eat(self):
  print("%s is eating..." %self.name)

 def sleep(self):
  print("%s is sleeping..." %self.name)

 def talk(self):
  print("%s is talking..." %self.name)

class Man(People):  #繼承父類People類
 def __init__(self,name,age,money):
  #People.__init__(self,name,age)  #(方法一)對構(gòu)造函數(shù)進行重構(gòu)、添加父類中沒有的屬性
  super(Man,self).__init__(name,age) #(方法二)利用super對構(gòu)造函數(shù)進行重構(gòu)(新式類寫法)
  self.money = money
  print("%s have money %s$" %(self.name,self.money))

 def make_money(self):
  print("%s is making money..." %self.name)

 def sleep(self):
  People.sleep(self)  #對父類方法的擴展
  print("man is sleeping...")

class Women(People):
 def shop(self):
  print("%s is shopping..." %self.name)

m1 = Man("Jack","20",10)
m1.eat()
m1.make_money()
m1.sleep()

w1 = Women("Amy","25")
w1.talk()
w1.shop()

運行結(jié)果:

J ack have money 10$
Jack is eating...
Jack is making money...
Jack is sleeping...
man is sleeping...
Amy is talking...
Amy is shopping...

5、多繼承方式

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#類的繼承
#class People:  #經(jīng)典類
class People(object):  #新式類
 def __init__(self,name,age):
  self.name = name
  self.age = age
  self.friends = []

 def eat(self):
  print("%s is eating..." %self.name)

 def sleep(self):
  print("%s is sleeping..." %self.name)

 def talk(self):
  print("%s is talking..." %self.name)

class Relationship(object):
 def make_friends(self,obj):
  print("%s is making friends with %s" %(self.name,obj.name))
  self.friends.append(obj)

class Man(People,Relationship):  #多繼承
 def __init__(self,name,age,money):
  #People.__init__(self,name,age)  #(方法一)對構(gòu)造函數(shù)進行重構(gòu)、添加父類中沒有的屬性
  super(Man,self).__init__(name,age) #(方法二)利用super對構(gòu)造函數(shù)進行重構(gòu)(新式類寫法)
  self.money = money
  print("%s have money %s$" %(self.name,self.money))

 def make_money(self):
  print("%s is making money..." %self.name)

 def sleep(self):
  People.sleep(self)  #對父類方法的擴展
  print("man is sleeping...")

class Women(People,Relationship): #多繼承
 def shop(self):
  print("%s is shopping..." %self.name)

m1 = Man("Jack","20",10)

w1 = Women("Amy","25")

m1.make_friends(w1)
w1.name = "liu"
print(m1.friends)

運行結(jié)果:

Jack have money 10$
Jack is making friends with Amy
[<__main__.Women object at 0x0057FA30>]

6、新式類與經(jīng)典類的繼承順序

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

class A(object):		#新式類
 def __init__(self):
  print("A")

class B(A):
 def __init__(self):
  
  print("B")

class C(A):
 def __init__(self):
  print("C")

class D(B,C):
 def __init__(self):
  pass
  #print("D")

obj = D()



7、繼承示例——學校、教師與學生

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

#繼承實例(新式類)——模擬學校、教師與學生

class School(object):
 def __init__(self,name,addr):
  self.name = name
  self.addr = addr
  self.students = []
  self.stuffs = []

 def enroll(self,stu_obj):  #學生注冊
  print("%s 學員辦理注冊" %stu_obj.name)
  self.students.append(stu_obj)

 def heir(self,staff_obj):  #聘請教師
  print("聘請教師 %s" %staff_obj.name)
  self.stuffs.append(staff_obj)

class SchoolMember(object):
 def __init__(self,name,age,sex):
  self.name = name
  self.age = age
  self.sex = sex

 def tell(self):
  pass

class Teacher(SchoolMember):
 def __init__(self,name,age,sex,salary,course):
  super(Teacher,self).__init__(name,age,sex)
  self.salary = salary
  self.course = course

 def tell(self):
  print('''
  ----- info of Teacher:%s -----
  Name:%s
  Age:%s
  Sex:%s
  Salary:%s
  Course:%s
  '''%(self.name,self.name,self.age,self.sex,self.salary,self.course))

 def teach(self):
  print("%s is teaching course [%s]" %(self.name,self.course))

class Student(SchoolMember):
 def __init__(self,name,age,sex,stu_id,grade):
  super(Student,self).__init__(name,age,sex)
  self.stu_id = stu_id
  self.grade = grade

 def tell(self):
  print('''
  ----- info of Student:%s -----
  Name:%s
  Age:%s
  Sex:%s
  Stu_id:%s
  Grade:%s
  '''%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade))

 def pay_tuition(self,amount):
  print("%s has paied tuition for $%s" %(self.name,amount))

#實例化
school = School("qinghua","beijing")

t1 = Teacher("Jack","30","M","20000","Python")
t2 = Teacher("Amy","28","F","15000","Linux")

s1 = Student("liu","23","M","1701","Python")
s2 = Student("wang","25","F","1702","Linux")

#調(diào)用顯示學生與教師的信息
t1.tell()
s1.tell()

school.heir(t1)  #聘請教師t1
school.enroll(s1) #學生s1注冊
school.enroll(s2)

print(school.stuffs)
print(school.students)

#聘請的第一位教師教課
school.stuffs[0].teach()
for stu in school.students:
 stu.pay_tuition(5000)

運行結(jié)果:

        ----- info of Teacher:Jack -----
        Name:Jack
        Age:30
        Sex:M
        Salary:20000
        Course:Python
       
 
        ----- info of Student:liu -----
        Name:liu
        Age:23
        Sex:M
        Stu_id:1701
        Grade:Python
       
聘請教師 Jack
liu 學員辦理注冊
wang 學員辦理注冊
[<__main__.Teacher object at 0x0059FDB0>]
[<__main__.Student object at 0x0059FDF0>, <__main__.Student object at 0x0059FE10>]
Jack is teaching course [Python]
liu has paied tuition for $5000
wang has paied tuition for $5000

8、多態(tài)(polymorphisn)——一種接口,多種形態(tài)

(1)定義

多態(tài)性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術(shù),

賦值之后,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。

簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

多態(tài)的作用:我們知道,封裝可以隱藏實現(xiàn)細節(jié),使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。

而多態(tài)則是為了實現(xiàn)另一個目的——接口重用!多態(tài)的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調(diào)用。

Pyhon 很多語法都是支持多態(tài)的,比如 len(),sorted(), 你給len傳字符串就返回字符串的長度,傳列表就返回列表長度。

(2)示例代碼:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu

class Animal(object):
 def __init__(self,name):
  self.name = name

 def talk(self):
  raise NotImplementedError("Subclass must implement abstract method")

 # 多態(tài)——一種接口,多種形態(tài)
 @staticmethod
 def animal_talk(obj):
  obj.talk()

class Cat(Animal):
 def talk(self):
  print("%s Meow!" %self.name)

class Dog(Animal):
 def talk(self):
  print("%s Woof! Woof!" % self.name)

d = Dog("A")
#d.talk()

c = Cat("B")
#c.talk()

#多態(tài)
Animal.animal_talk(d)
Animal.animal_talk(c)

運行結(jié)果:

A Woof! Woof!
B Meow!

9、面向?qū)ο笤O計利器——領域建模

(1)定義

從領域模型開始,我們就開始了面向?qū)ο蟮姆治龊驮O計過程,可以說,領域模型是完成從需求分析到面向 對象設計的一座橋梁。 
領域模型,顧名思義,就是需求所涉及的領域的一個建模,更通俗的講法是業(yè)務模型。

(2)領域模型有兩個主要的作用:
發(fā)掘重要的業(yè)務領域概念
建立業(yè)務領域概念之間的關(guān)系 

 (3)領域建模三字經(jīng) 
領域模型如此重要,領域建模的方法概括一下就是“找名詞”! 即使是簡單的找名詞這樣的操作,也涉及到分析和提煉,而 不是簡單的摘取出來就可,

這種情況下分析師和設計師的經(jīng)驗和技能就能夠派上用場了。但領域模型分析 也確實相對簡單,即使沒有豐富的經(jīng)驗和高超的技巧,至少也能完成一個能用的領域模型。

一個關(guān)鍵的問題:從哪里找? 因為領域模型是“需求到面向?qū)ο蟮臉蛄骸?,能想到:從需求模型中找,具體來說就是從用例中找。 

歸納:領域建模的方法就是“從用例中找名詞”。 當然,找到名詞后,為了能夠更加符合面向?qū)ο蟮囊蠛吞攸c。

我們還需要對這些名詞進一步完善,這就 是接下來的步驟:加屬性,連關(guān)系!

最后我們總結(jié)出領域建模的三字經(jīng)方法:找名詞、加屬性、連關(guān)系。 



更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O計入門與進階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進階經(jīng)典教程

希望本文所述對大家Python程序設計有所幫助。

相關(guān)文章

  • Python編程中time模塊的一些關(guān)鍵用法解析

    Python編程中time模塊的一些關(guān)鍵用法解析

    這篇文章主要介紹了Python編程中time模塊的一些關(guān)鍵用法解析,像mktime和localtime以及gmtime這些常用方法都有講到,需要的朋友可以參考下
    2016-01-01
  • Python自動化辦公之Word文檔的創(chuàng)建與生成

    Python自動化辦公之Word文檔的創(chuàng)建與生成

    這篇文章主要為大家詳細介紹了如何通過python腳本來自動生成一個?word文檔,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-05-05
  • Python中的迭代器和生成器詳解

    Python中的迭代器和生成器詳解

    這篇文章主要介紹了Python中的迭代器和生成器詳解,生成器表達式是用來生成函數(shù)調(diào)用時序列參數(shù)的一種迭代器寫法,生成器對象可以遍歷或轉(zhuǎn)化為列表或元組等數(shù)據(jù)結(jié)構(gòu),但不能切片,需要的朋友可以參考下
    2023-07-07
  • 使用Python更換外網(wǎng)IP的方法

    使用Python更換外網(wǎng)IP的方法

    這篇文章主要介紹了使用Python更換外網(wǎng)IP的方法,,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Pytorch 實現(xiàn)計算分類器準確率(總分類及子分類)

    Pytorch 實現(xiàn)計算分類器準確率(總分類及子分類)

    今天小編就為大家分享一篇Pytorch 實現(xiàn)計算分類器準確率(總分類及子分類),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python實現(xiàn)音樂播放器 python實現(xiàn)花框音樂盒子

    python實現(xiàn)音樂播放器 python實現(xiàn)花框音樂盒子

    這篇文章主要為大家詳細介紹了python實現(xiàn)音樂播放器,實現(xiàn)花框音樂盒子,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 談談對Pytorch中的forward的理解

    談談對Pytorch中的forward的理解

    這篇文章主要介紹了談談對Pytorch中的forward的理解,在Pytorch中,forward方法是一個特殊的方法,被專門用來進行前向傳播,本文給大家詳細講解,需要的朋友可以參考下
    2023-04-04
  • Python實現(xiàn)圖數(shù)據(jù)處理的完整指南

    Python實現(xiàn)圖數(shù)據(jù)處理的完整指南

    圖是一種非常重要的數(shù)據(jù)結(jié)構(gòu),在Python中,我們可以使用鄰接矩陣來表示圖,這篇文章主要為大家介紹了Python實現(xiàn)圖數(shù)據(jù)處理的相關(guān)知識,需要的可以參考下
    2024-04-04
  • Python打印“菱形”星號代碼方法

    Python打印“菱形”星號代碼方法

    本篇文章通過代碼實例給大家詳細分析了Python打印“菱形”星號代碼方法,對此有需要的朋友參考下吧。
    2018-02-02
  • Python-Tkinter Text輸入內(nèi)容在界面顯示的實例

    Python-Tkinter Text輸入內(nèi)容在界面顯示的實例

    今天小編就為大家分享一篇Python-Tkinter Text輸入內(nèi)容在界面顯示的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論