中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
Python面向?qū)ο缶幊蘝python面相對(duì)象編程

看到這個(gè)題目,很多人會(huì)問(wèn)什么是面向?qū)ο缶幊?,也許也有人說(shuō)我只知道面向過(guò)程編程,那么我們來(lái)說(shuō)說(shuō)這兩種編程。通俗一點(diǎn)講面向過(guò)程就是你想干嘛,就直接寫個(gè)功能函數(shù)來(lái)實(shí)現(xiàn)你想做的事,它面向的是以動(dòng)作為主導(dǎo),通過(guò)函數(shù)或者方法來(lái)實(shí)現(xiàn);而面向?qū)ο?span style="color:#ff9900;">主導(dǎo)因素是對(duì)象,實(shí)現(xiàn)的不是函數(shù),而是“類”。把一組數(shù)據(jù)結(jié)構(gòu)和處理它們的方法組成對(duì)象(object),把相同行為的對(duì)象歸納為類(class)。類就是對(duì)對(duì)象的抽象,而對(duì)象是類的實(shí)例。那么下面我們主要針對(duì)類的定義和特征(封裝、繼承、多態(tài))進(jìn)行分析。

定義類

在python中使用'class’關(guān)鍵字定義類,并以冒號(hào)結(jié)束。然后在類中定義一些屬性和通過(guò)之前學(xué)習(xí)過(guò)的函數(shù)來(lái)定義方法,這樣我們就可以把對(duì)象的動(dòng)態(tài)特征描述出來(lái)。具體使用如下:

class 類名(object):

        # __init__是一個(gè)特殊方法用于在創(chuàng)建對(duì)象時(shí)進(jìn)行初始化操作
       def __init__(self, 參數(shù)):
             初始化代碼

代碼如下所示:

  1. class Teacher(object):
  2. # __init__是一個(gè)特殊方法用于在創(chuàng)建對(duì)象時(shí)進(jìn)行初始化操作
  3. # 通過(guò)這個(gè)方法我們可以為老師對(duì)象綁定name和age兩個(gè)屬性
  4. def __init__(self, name, age):
  5. self.name = name
  6. self.age = age
  7. def teach(self, course_name):
  8. print('%s正在教%s.' % (self.name, course_name))

創(chuàng)建和使用對(duì)象

當(dāng)我們定義好一個(gè)類之后,可以通過(guò)下面的方式來(lái)創(chuàng)建對(duì)象并給對(duì)象發(fā)消息。代碼如下:

  1. def main():
  2. # 創(chuàng)建教師對(duì)象并指定姓名和年齡
  3. teacher1 = Teacher('諸葛亮', 38)
  4. # 給對(duì)象發(fā)teach消息
  5. teacher1.teach('Python程序設(shè)計(jì)')
  6. if __name__ == '__main__':
  7. main()

 靜態(tài)方法和類方法

類的三種方法,分別是類方法、普通方法和靜態(tài)方法,如下是這三種方法的概念:

靜態(tài)方法: 用 @staticmethod 裝飾的不帶 self 參數(shù)的方法叫做靜態(tài)方法,類的靜態(tài)方法可以沒(méi)有參數(shù),可以直接使用類名調(diào)用。

普通方法: 默認(rèn)有個(gè)self參數(shù),且只能被對(duì)象調(diào)用。

類方法: 默認(rèn)有個(gè) cls 參數(shù),可以被類和對(duì)象調(diào)用,需要加上 @classmethod 裝飾器。

在這里主要聊聊靜態(tài)方法和類方法,現(xiàn)在我們先說(shuō)靜態(tài)方法,從定義中我們知道靜態(tài)方法不屬于任何一個(gè)對(duì)象的。例如,我們定義一個(gè)“三角形”類的時(shí)候,我們會(huì)定義很多相關(guān)的方法,如計(jì)算周長(zhǎng)和面積,但是我們還有一個(gè)判斷三條邊長(zhǎng)是否可以構(gòu)成三角形的方式,顯然它不屬于對(duì)象方法。為了解決這種問(wèn)題,我們使用靜態(tài)方法來(lái)處理,代碼如下:

  1. from math import sqrt
  2. class Triangle(object):
  3. def __init__(self, a, b, c):
  4. self._a = a
  5. self._b = b
  6. self._c = c
  7. @staticmethod
  8. def is_valid(a, b, c):
  9. return a + b > c and b + c > a and a + c > b
  10. def perimeter(self):
  11. return self._a + self._b + self._c
  12. def area(self):
  13. half = self.perimeter() / 2
  14. return sqrt(half * (half - self._a)*(half - self._b) * (half - self._c))
  15. def main():
  16. a, b, c = 3, 4, 5
  17. # 靜態(tài)方法和類方法都是通過(guò)給類發(fā)消息來(lái)調(diào)用的
  18. if Triangle.is_valid(a, b, c):
  19. t = Triangle(a, b, c)
  20. print(t.perimeter())
  21. # 也可以通過(guò)給類發(fā)消息來(lái)調(diào)用對(duì)象方法但是要傳入接收消息的對(duì)象作為參數(shù)
  22. # print(Triangle.perimeter(t))
  23. print(t.area())
  24. # print(Triangle.area(t))
  25. else:
  26. print('無(wú)法構(gòu)成三角形.')
  27. if __name__ == '__main__':
  28. main()

其實(shí)類中還有一種方法和靜態(tài)方法比較類似,它就是類方法。它代表的是當(dāng)前類相關(guān)的信息的對(duì)象(類本身也是一個(gè)對(duì)象,有的地方也稱之為類的元數(shù)據(jù)對(duì)象),通過(guò)這個(gè)參數(shù)我們可以獲取和類相關(guān)的信息并且可以創(chuàng)建出類的對(duì)象,代碼如下所示:

  1. from time import time, localtime, sleep
  2. class Clock(object):
  3. """數(shù)字時(shí)鐘"""
  4. def __init__(self, hour=0, minute=0, second=0):
  5. self._hour = hour
  6. self._minute = minute
  7. self._second = second
  8. @classmethod
  9. def now(cls):
  10. ctime = localtime(time())
  11. return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)
  12. def show(self):
  13. """顯示時(shí)間"""
  14. return '%02d:%02d:%02d' % (self._hour, self._minute, self._second)
  15. def main():
  16. # 通過(guò)類方法創(chuàng)建對(duì)象并獲取系統(tǒng)時(shí)間
  17. clock = Clock.now()
  18. while True:
  19. print(clock.show())
  20. sleep(1)
  21. if __name__ == '__main__':
  22. main()

類之間的關(guān)系

類和類之間的關(guān)系有三種:is-a、has-a和use-a關(guān)系

is-a關(guān)系也叫繼承或泛化,比如動(dòng)物和貓的關(guān)系屬于繼承關(guān)系

has-a關(guān)系通常稱之為關(guān)聯(lián),比如學(xué)校和教師的關(guān)系屬于關(guān)聯(lián)關(guān)系

use-a關(guān)系通常稱之為依賴,比如人和空氣的關(guān)系屬于依賴關(guān)系

這里我們主要舉例講解has-a和use-a關(guān)系,is-a關(guān)系在繼承和多態(tài)中舉例說(shuō)明,代碼如下:

  1. #has-a關(guān)系
  2. class Person:
  3. def play(self, tools):
  4. tools.run()
  5. print('終于能打游戲了')
  6. class Phone:
  7. def run(self):
  8. print('王者榮耀已經(jīng)登陸')
  9. PH = Phone()
  10. p = Person()
  11. p.play(PH)
  12. #use-a關(guān)系
  13. class School:
  14. def __init__(self, name):
  15. self.teach_list = []
  16. def join_us(self,teach):
  17. self.teach_list.append(teach)
  18. def to_teach(self):
  19. for t in self.teach_list:
  20. t.work()
  21. class Teacher:
  22. def __init__(self, name):
  23. self.name = name
  24. def work(self):
  25. print(f'{self.name}在上課')
  26. x = School('清華大學(xué)')
  27. t1 = Teacher('李老師')
  28. t2 = Teacher('劉老師')
  29. x.join_us(t1)
  30. x.join_us(t2)
  31. x.to_teach()

繼承和多態(tài)

繼承是啥,繼承就是在原有的類基礎(chǔ)上創(chuàng)建新類,讓新類擁有原有類的屬性和方法,這就是繼承。提供繼承信息的叫做父類,也叫超類或基類;得到繼承信息的叫做子類,也叫派生類或衍生類。子類除了繼承父類提供的屬性和方法,還可以定義自己特有的屬性和方法,所以子類比父類擁有的更多的能力。繼承的例子如下:

  1. class Animal(object):
  2. def __init__(self):
  3. self._name = ""
  4. self._age = 0
  5. @property
  6. def age(self):
  7. return self._age
  8. @age.setter
  9. def age(self, age):
  10. self._age = age
  11. @property
  12. def name(self):
  13. return self._name
  14. @name.setter
  15. def name(self, name):
  16. self._name = name
  17. def show(self):
  18. print("%s, %d" % (self._name, self._age))
  19. class Dog(Animal):
  20. def __init__(self):
  21. Animal.__init__(self)
  22. self._age = 1
  23. self._name = "狗"
  24. class Cat(Animal):
  25. def __init__(self):
  26. super().__init__()
  27. self._name = "貓"
  28. self._age = 2
  29. dog = Dog()
  30. dog.show()
  31. cat = Cat()
  32. cat.show()

子類在繼承了父類的方法后,可以對(duì)父類已有的方法給出新的實(shí)現(xiàn)版本,這個(gè)動(dòng)作稱之為方法重寫(override)。通過(guò)方法重寫我們可以讓父類的同一個(gè)行為在子類中擁有不同的實(shí)現(xiàn)版本,當(dāng)我們調(diào)用這個(gè)經(jīng)過(guò)子類重寫的方法時(shí),不同的子類對(duì)象會(huì)表現(xiàn)出不同的行為,這個(gè)就是多態(tài)。多態(tài)代碼如下:

  1. from abc import ABCMeta, abstractmethod
  2. class Animal(object, metaclass=ABCMeta):
  3. def __init__(self):
  4. self._name = ""
  5. self._age = 0
  6. @abstractmethod
  7. def show(self):
  8. pass
  9. class Dog(Animal):
  10. def __init__(self):
  11. Animal.__init__(self)
  12. self._age = 1
  13. self._name = "狗"
  14. def show(self):
  15. print("%s, %d 旺旺" % (self._name, self._age))
  16. class Cat(Animal):
  17. def __init__(self):
  18. super().__init__()
  19. self._name = "貓"
  20. self._age = 2
  21. def show(self):
  22. print("%s, %d 喵喵" % (self._name, self._age))
  23. dog = Dog()
  24. dog.show()
  25. cat = Cat()
  26. cat.show()

在上面的代碼中,我們將`Animal`類處理成了一個(gè)抽象類,所謂抽象類就是不能夠創(chuàng)建對(duì)象的類,這種類的存在就是專門為了讓其他類去繼承它。python通過(guò)`abc`模塊的`ABCMeta`元類和`abstractmethod`包裝器來(lái)達(dá)到抽象類的效果,如果一個(gè)類中存在抽象方法那么這個(gè)類就不能夠?qū)嵗▌?chuàng)建對(duì)象)。上面的代碼中,`Dog`和`Cat`兩個(gè)子類分別對(duì)`Animal`類中的`show`抽象方法進(jìn)行了重寫并給出了不同的實(shí)現(xiàn)版本,當(dāng)我們調(diào)用該方法時(shí),這個(gè)方法就表現(xiàn)出了多態(tài)行為。

訪問(wèn)可見(jiàn)性問(wèn)題和@property裝飾器

在其他高級(jí)語(yǔ)言(c++,c#)中,對(duì)屬性和方式都有訪問(wèn)權(quán)限(也稱為可見(jiàn)性),主要有三種訪問(wèn)權(quán)限:私有的(private)或受保護(hù)的(protected)和 公開(kāi)的(public)。但python中的屬性和方法的訪問(wèn)權(quán)限只有兩種,也就是公開(kāi)的和私有的,如果希望是私有的,則在給其命名時(shí)可以用兩個(gè)下劃線作為開(kāi)頭。對(duì)屬性還可以通過(guò)使用@property包裝器來(lái)包裝getter和setter方法來(lái)對(duì)屬性的訪問(wèn)既安全又方便。代碼如下:

  1. class Pet(object):
  2. def __init__(self, name, age):
  3. self._name = name
  4. self._age = age
  5. @property
  6. def age(self):
  7. return self._age
  8. @age.setter
  9. def age(self, age):
  10. self._age = age
  11. @property
  12. def name(self):
  13. return self._name
  14. @name.setter
  15. def name(self, name):
  16. self._name = name
  17. def __make_voice(self):
  18. print("%s, %d 哈哈哈哈" % (self._name, self._age))
  19. def show(self):
  20. print("%s, %d" % (self._name, self._age))
  21. pet1= Pet("狗", 1)
  22. pet1.show()
  23. pet1.name = "貓"
  24. pet1.age= 5
  25. pet1.show()
  26. # AttributeError: 'Pet' object has no attribute '__make_voice'
  27. #pet1.__make_voice()

 __slots__ 魔法

Python動(dòng)態(tài)語(yǔ)言允許我們?cè)诔绦蜻\(yùn)行時(shí)給對(duì)象綁定新的屬性或方法,當(dāng)然也可以對(duì)已經(jīng)綁定的屬性和方法進(jìn)行解綁定。但是如果我們需要限定自定義類型的對(duì)象只能綁定某些屬性,可以通過(guò)在類中定義__slots__變量來(lái)進(jìn)行限定。需要注意的是__slots__的限定只對(duì)當(dāng)前類的對(duì)象生效,對(duì)子類并不起任何作用。例如:

  1. class Person(object):
  2. # 限定Person對(duì)象只能綁定_name, _age和_gender屬性
  3. __slots__ = ('_name', '_age', '_gender')
  4. def __init__(self, name, age):
  5. self._name = name
  6. self._age = age
  7. @property
  8. def name(self):
  9. return self._name
  10. @property
  11. def age(self):
  12. return self._age
  13. @age.setter
  14. def age(self, age):
  15. self._age = age
  16. def play(self):
  17. if self._age <= 16:
  18. print('%s正在玩飛行棋.' % self._name)
  19. else:
  20. print('%s正在玩斗地主.' % self._name)
  21. def main():
  22. person = Person('諸葛亮', 22)
  23. person.play()
  24. person._gender = '男'
  25. # AttributeError: 'Person' object has no attribute '_is_gay'
  26. # person._is_gay = True
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
初識(shí)Python(四)
從Zero到Hero,一文掌握Python關(guān)鍵代碼
三、Python __init__()類構(gòu)造方法
python基礎(chǔ)之面對(duì)對(duì)象之類和對(duì)象
從零學(xué)Python:17課-面向?qū)ο缶幊蹋ㄟM(jìn)階)
Python 從Zero 到 Hero(三)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服