最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python面向?qū)ο蟪绦蛟O(shè)計類的封裝與繼承用法示例

 更新時間:2019年04月12日 11:34:00   作者:微信1257309054  
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計類的封裝與繼承用法,結(jié)合實例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計中類的封裝、繼承相關(guān)概念、原理、用法及操作注意事項,需要的朋友可以參考下

本文實例講述了Python面向?qū)ο蟪绦蛟O(shè)計類的封裝與繼承用法。分享給大家供大家參考,具體如下:

訪問限制(封裝)

1、概念

面向?qū)ο笳Z言的三大特征:封裝, 繼承, 多態(tài)。

廣義的封裝: 類和函數(shù)的定義本身就是封裝的體現(xiàn)。

狹義的封裝:一個類的某些屬性,不希望外界直接訪問,而是把這個屬性私有化[只有當前類持有],然后暴露給外界一個訪問的方法。

封裝的本質(zhì):就是屬性私有化的過程。

封裝的好處:提供了數(shù)據(jù)的復(fù)用性,保證了數(shù)據(jù)的安全性。

舉例:插排

2、使用

class Person(object):
 def __init__(self, name, age, height, weight, money):
  self.name = name
  self.__age__ = age
  self.weight = weight
  self.__money = money
  self.__height = height
 def run(self):
  print(self.__money)
 def eat(self):
  print("eat")
 # 通過內(nèi)部方法,去修改、獲取私有屬性
 # 通過自定義的方法實現(xiàn)對私有屬性的賦值與取值
 # set方法:setxxx
 def setMoney(self, money):
  # 數(shù)據(jù)的過濾
  if money < 0:
   money = 0
  self.__money = money
 # get方法:getXXX
 def getMoney(self):
  return self.__money
per = Person("hanmeimei", 20, 170, 55, 10000)
# 1.屬性被私有化之后的訪問
# 如果要讓內(nèi)部屬性不被外部直接訪問,在屬性前加兩個下劃線(__),
# 在python中如果在屬性前面加兩個下劃線,name這個屬性就變成了私有屬性[private]
# 私有屬性的含義:在外界不能像以前那么直接訪問
# print(per.__money) #無法在外界直接訪問
per.run() # 內(nèi)部可以訪問
# 2.解決辦法: 如何對私有屬性取值和賦值
# 屬性被私有化之后,可以通過get/set的方法進行訪問
per.setMoney(10)
print(per.getMoney())
# 3.工作原理
# 不能直接訪問per.__money是因為python解釋器把__money變成了_Person__money
# 仍然可以使用_Person__money去訪問,但是強烈不建議這么干,不同的解釋器可能存在解釋的變量名不一致的問題
per._Person__money = 1
print(per.getMoney())
# 4.特殊情況
# 在Python中 __xxx__ 屬于特殊變量,將不再屬于私有變量,可以直接訪問
print(per.__age__)
# 在python中 __xxx變量,這樣的實例變量外部是可以訪問的,但是,按照約定的規(guī)則
# 當我們看到這樣的變量時,意思雖然是"雖然我可以被訪問,但是請把我視為私有變量,不要直接訪問我"
print(per._Person__height)

輸出:

10000
10
1
20
170

繼承

1、概念

如果兩個或者兩個以上的類具有相同的屬性和方法,我們可以抽取一個類出來,

在抽取的類中聲明公共的部分

​ 被抽取出來的類 ——父類 超類 基類
​ 其他類 —— 子類 派生類
​ 他們之間的關(guān)系 ——子類繼承自父類

2、單繼承

簡單來說,一個子類只有一個父類,被稱為單繼承

演示:test.py 文件

注意:在使用繼承時,盡量一個類存在于一個模塊中

from person import Person
from student import Student
from worker import Worker
per = Person("aa", 1, 2)
stu = Student("tom", 18, 12345, 110)
print(stu.name, stu.age)
stu.run()
print(stu.stuId)
#私有屬性
#print(stu.__money)
print(stu.getMoney())#通過繼承過來的共有方法訪問私有屬性
#stu.stuFunc()
wor = Worker("lilei", 20, 111)
print(wor.name, wor.age)
wor.eat("apple")
#子類對象調(diào)用父類同名的函數(shù),則優(yōu)先調(diào)用子類中的函數(shù)
#本質(zhì)是子類中的方法覆蓋了父類中同名的函數(shù)
wor.run()
print(per.getMoney())
#父類對象不能訪問子類特有的屬性或方法
#print(per.stuId)

輸出:

tom 18
run
110
12345
lilei 20
eat apple
子類中的run方法被調(diào)用了
2

person.py文件:

#以前的寫法 class Person(object):
#但是實質(zhì)上,如果沒有顯示的寫出父類,則這個類的父類默認為object
#object是所有類的父類或者超類
class Person(object):
 #構(gòu)造方法
 def __init__(self, name, age, money):
  self.name = name
  self.age = age
  self.__money = money
  #get/set方法
 def setMoney(self, money):
  self.__money = money
 def getMoney(self):
  return self.__money
 def run(self):
  print("run")
 def eat(self, food):
  print("eat", food)

#student.py文件
from person import Person
class Student(Person):
 def __init__(self, name, age, money, stuId):
  #調(diào)用父類中的構(gòu)造方法
  #方法1 super(當前類,self).__init__(參數(shù)列表)
  #super(Student,self).__init__(name, age, money, stuId)
  #方法2 父類名.__init__(屬性列表)
  Person.__init__(self, name, age, money)
  #子類可以有一些自己獨有的屬性
  self.stuId = stuId
 def setFunc(self):
  print(self.__money)

#worker.py文件
from person import Person
class Worker(Person):
 def __init__(self, name, age, money):
  super(Worker,self).__init__(name, age, money)
 # 在子類中定義和一個父類中重名的函數(shù)
 def run(self):
  print("子類中的run方法被調(diào)用了")

總結(jié):

繼承的特點:

a. 子類對象可以直接訪問父類中未私有的對象
b. 子類對象可以調(diào)用父類中的方法
c. 父類對象不能訪問子類中特有的屬性或者方法

優(yōu)缺點:

優(yōu)點:

1.可以簡化代碼,減少冗余
2.提高代碼的維護性
3.提高了代碼的安全性

缺點:

耦合和內(nèi)聚被用來描述類與類之間的關(guān)系,耦合性越低,內(nèi)聚性越高,說明代碼越好。
但是,在繼承關(guān)系中,耦合性相對比較高,如果修改父類,子類也會隨著變化。

3、多繼承

顧名思義:就是一個子類中可以有多個父類,比如一個孩子有一個爸爸一個媽媽

from child import Child
def main():
 c = Child(300, 100,"xiaoming")
 print(c.money, c.faceValue)
 c.play()
 c.eat()
 #注意:如果多個父類中的方法名相同,默認調(diào)用的是子類括號中排前面的父類中的方法
 #此時調(diào)用的是Father中func方法
if __name__ == "__main__":
 main()

輸出:

300 100
play
eat

#father.py文件
class Father(object):
 def __init__(self, money):
  self.money = money
 def play(self):
  print("play")
 def func(self):
  print("Father")

#mother.py文件
class Mother(object):
 def __init__(self, faceValue):
  self.faceValue = faceValue
 def eat(self):
  print("eat")
 def func(self):
  print("Mother")

#child.py文件
from father import Father
from mother import Mother
class Child(Father, Mother):
 def __init__(self, money, faceValue,name):
  #注意:分別調(diào)用各個父類中的構(gòu)造方法
  Father.__init__(self, money)
  Mother.__init__(self, faceValue)
  #子類中同樣可以有自己獨有的特性
  self.name = name

總結(jié):

子類可以從多個父類中繼承屬性和方法
一個父類可以有多個子類
一個子類可以有多個父類

4、函數(shù)重寫

4.1、系統(tǒng)函數(shù)

'''
重寫:將函數(shù)重寫一遍
__str__():在調(diào)用print打印對象時自動調(diào)用,是給用戶用的,是一個描述對象的方法.
__repr__():是給機器用的,在python解釋器里面直接敲對象名在回車后調(diào)用方法
注意:在沒有str,且有repr時,str=repr
'''
class Animal(object):
 def __init__(self, name, age, height, weight):
  self.name = name
  self.age = age
  self.height = height
  self.weight = weight
 def __str__(self):
  return "%s-%d-%d-%d"%(self.name, self.age, self.height, self.weight)
ani = Animal("大黃", 5, 60, 25)
#print(per.name, per.age, per.height, per.weight)
#在打印ani時自動調(diào)用str函數(shù)
print(ani)
#優(yōu)點或者使用時機:當一個對象的屬性值很多,并且都需要打印,重寫__str__方法后,簡化了代碼,方便查看.

輸出:

大黃-5-60-25

5、自定義函數(shù)

重寫函數(shù)的時機:當父類中函數(shù)的功能滿足不了子類的需求時,就可以進行重寫。
演示:

from smallAnimal import SmallAnimal
from cat import Cat
c = Cat()
c.func()

#smallAnimal.py文件
class SmallAnimal(object):
 def func(self):
  print("wwww")

#cat.py文件
from smallAniml import SmallAnimal
class Cat(SmallAnimal):
 def func(self):
  print("呵呵呵")

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

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

相關(guān)文章

  • python列表中remove()函數(shù)的使用方法詳解

    python列表中remove()函數(shù)的使用方法詳解

    這篇文章主要給大家介紹了關(guān)于python列表中remove()函數(shù)的使用,以及Python列表的remove方法的注意事項,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • 用gpu訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),用tensorflow-cpu跑出錯的原因及解決方案

    用gpu訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),用tensorflow-cpu跑出錯的原因及解決方案

    這篇文章主要介紹了用gpu訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),用tensorflow-cpu跑出錯的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python異常處理知識點總結(jié)

    Python異常處理知識點總結(jié)

    在本篇文章中小編給大家分享了關(guān)于Python異常處理的相關(guān)知識點以及對應(yīng)的實例內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • OpenCV-Python實現(xiàn)人臉美白算法的實例

    OpenCV-Python實現(xiàn)人臉美白算法的實例

    人臉美白原理說透了,就是一種圖像的顏色空間處理,所以我們需要通過顏色空間進行設(shè)計。本文就詳細的介紹一下,感興趣的可以了解一下
    2021-06-06
  • 探究python中open函數(shù)的使用

    探究python中open函數(shù)的使用

    這篇文章主要為大家詳細介紹了python中open函數(shù)的使用方法,對python文件方法open進行深入研究,感興趣的小伙伴們可以參考一下
    2016-03-03
  • win10下python3.8的PIL庫安裝過程

    win10下python3.8的PIL庫安裝過程

    這篇文章主要介紹了win10下python3.8的PIL庫安裝方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Python實現(xiàn)統(tǒng)計文本中的字符數(shù)量

    Python實現(xiàn)統(tǒng)計文本中的字符數(shù)量

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)統(tǒng)計文本中的字符數(shù)量,包括中/英文字符、數(shù)字、特殊字符等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • python 模塊導(dǎo)入問題匯總

    python 模塊導(dǎo)入問題匯總

    在本篇文章里小編給大家整理的是一篇關(guān)于python 模塊導(dǎo)入問題匯總內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • python遺傳算法之geatpy的深入理解

    python遺傳算法之geatpy的深入理解

    本文主要介紹了python遺傳算法之geatpy的深入理解,主要從geatpy中的各種數(shù)據(jù)結(jié)構(gòu)一步一步進行學(xué)習(xí),具有一定的參考價值,感興趣的可以了解一下
    2022-04-04
  • python內(nèi)置模塊datetime.timedelta計算時間間隔示例代碼

    python內(nèi)置模塊datetime.timedelta計算時間間隔示例代碼

    Python的datetime模塊提供了處理日期和時間的功能,包括datetime.date、datetime.time、datetime.datetime、datetime.timedelta等類,timedelta用于表示時間間隔,支持日期和時間的加減運算,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2025-04-04

最新評論

抚松县| 紫云| 顺义区| 同江市| 潢川县| 芜湖县| 白山市| 怀柔区| 聂荣县| 定南县| 阿克苏市| 科尔| 聂荣县| 缙云县| 定兴县| 阳朔县| 石阡县| 叶城县| 西青区| 遂宁市| 清流县| 江口县| 阿图什市| 杨浦区| 水城县| 黄陵县| 嘉祥县| 蒙自县| 冕宁县| 同德县| 策勒县| 乌什县| 利川市| 平谷区| 武义县| 成安县| 西畴县| 郴州市| 界首市| 乌拉特后旗| 临朐县|