知识点 —— Python进阶-2
Python進階–2
面向對象–基礎
- 引入理解
https://blog.csdn.net/shenzixincaiji/article/details/83576687
類、對象、屬性、方法
- 基礎
- 高級一點
- 總結
類屬性
使用同一類創建不同的對象
- 若沒有改變過類屬性,可以通過類屬性改變,來改變對象中對應類屬性的值。一起改變
- 若某一對象更改了類屬性的值,則建立動態對象綁定,此對象中類屬性變為修改后的數值;其他對象的類屬性不變
- 再次改變類屬性,已經動態綁定的對象,其對象的類屬性不會受到影響;對于沒有“私自”更改類屬性的對象,其對應的類屬性仍然會受到影響
對象屬性
對象屬性是依據類創建對象的時候,每個對象都具有的公共屬性
其數值的更改需要通過調用對象屬性賦值來修改,不能通過類屬性更改
總結
類屬性,不允許對象私自修改,有類統一修改,影響所有對象
對象屬性,依據對象的特點,可以自己做出特定的修改。類沒有權限去修改對象屬性
對象方法
- 理解
在睡覺
dahuang在跑步
tom在跑步
在睡覺
對象方法
可以調用類屬性,也可以調用對象屬性
對象方法中的參數是對象self
對象方法之間可以相互調用
類方法
- 理解
只能調用類屬性: tom
類方法
依賴裝飾器,且只能調用類屬性,不能調用對象屬性(會報錯)
類方法中的參數是類,不依賴對象,可以獨立于對象做一些處理
類方法中不能調用對象方法
- 類方法和對象方法的理解
類屬性是公共屬性,對象屬性是私有屬性
類方法只能調用類屬性;而對象方法既能調用對象屬性,也能調用類屬性
靜態方法
class student(object):__tall = 'tom' # 對類屬性進行私有化high = 12def __init__(self, nickname):self.name = nicknameself.age = 'None'self.phone = 'None'def sleep(self):print('在睡覺')@staticmethoddef casual():print('只能調用類屬性tall:', student.__tall)print('只能調用類屬性high:', student.high)# basic student.casual()只能調用類屬性tall: tom
只能調用類屬性high: 12
也是只能訪問公共類屬性
靜態方法和類方法區別
不同
- 裝飾器不同
- 參數不同,一個有cls,一個無cls
相同
- 都只能訪問類屬性和方法,對象屬性和對象方法無法訪問
- 都可以通過類名調用訪問
- 都可以在對象創建之前調用,不依賴于對象
總結–↑
- 幾種方法都可以接受外部參數
outer1: 1 tom 12
outer3: 2 tom 12
outer3: 3 tom 12
- 各自特點
對象方法
- 可以調用對象屬性,也可以調用類屬性(私有和非私有的)
- 依賴對象,沒有對象就不能調用對象方法
- 沒有裝飾器
- 必須有self對象參數,也可以有外部參數
類方法
- 只能調用類屬性(私有的和非私有的)
- 不依賴對象,沒有對象也可以調用類方法
- 需要裝飾器,classmethod
- 必須有cls參數,也可以有其他外部參數
靜態方法
- 只能調用類屬性(私有和非私有的)
- 不依賴對象,沒有對象也可以調用靜態方法
- 需要裝飾器,staticmethod
- 不需要任何參數,但是也可以添加外部參數
面向對象–魔術方法
魔術方法
- http://c.biancheng.net/view/7817.html
- https://www.cnblogs.com/zhangboblogs/p/7860929.html
- https://www.cnblogs.com/nmb-musen/p/10861536.html
常用魔術方法
# __new__(self) 和 __init__(self) # 先執行new,再執行init,不要隨便動用new魔術方法class Test:def __init__(self):print("init方法")def __new__(cls, *args, **kwargs):print("重寫new方法")return super().__new__(cls)m = Test()重寫new方法
init方法
8
# __str__class Test:def __init__(self, name):self.name = namedef __str__(self):return "hello world" #必須有返回值,且必須為str類型# 調用方法1 t = Test("mingming") print(t)# 調用方法2 print(t.__str__())hello world
hello world
# __bool__class Test:def __init__(self, name):self.name = namedef __bool__(self):if self.name =="python": # 返回對象必須是True 或 Falsereturn Trueelse:return Falset = Test("python") t1 = Test("java") print(bool(t)) print(bool(t1))True
False
面向對象–私有化
類屬性的私有化
- 目的
為了防止外部任意修改公共類屬性
私有化的類屬性只能夠被類方法修改
class student(object):__tall = 'tom' # 對類屬性進行私有化high = 12def __init__(self, nickname):self.name = nicknameself.age = 'None'self.phone = 'None'def sleep(self):print('在睡覺')@classmethoddef test(cls):print('只能調用類屬性tall:',cls.__tall)print('只能調用類屬性high:', cls.high)@classmethoddef update(cls):cls.__tall = '把tom改為tttom' # basic student.test() student.high = '修改后' student.tall = '修改后' # 私有屬性,不可外界修改 student.test()student.update() # 使用類方法修改私有屬性 student.test()只能調用類屬性tall: tom
只能調用類屬性high: 12
只能調用類屬性tall: tom
只能調用類屬性high: 修改后
只能調用類屬性tall: 把tom改為tttom
只能調用類屬性high: 修改后
對象屬性的私有化
- 目的
為了防止對象屬性被不合理的修改
可以通過對象方法來修改私有的對象屬性
class PositiveInteger():def __init__(self):self.__name = 'Tom'self.__age = 15def setName(self, newname):self.__name = newnamedef setAge(self, newage):if 0 < newage < 100:self.__age = newageelse:print('年齡不符合要求')def __str__(self):return '學生的年齡:{},學生的名字:{}'.format(self.__age, self.__name)i = PositiveInteger()print(i) # i.__name 這是無法修改的 i.setName('TTTTom') i.setAge(150) print(i)學生的年齡:15,學生的名字:Tom
年齡不符合要求
學生的年齡:15,學生的名字:TTTTom
私有化的本質–↑
- 本質是通過修改內部的名字,讓你無法通過原名字訪問
- 可以找到真實的名字進行訪問,但是不建議這樣用
學生的年齡:15,學生的名字:Tom
學生的年齡:99,學生的名字:Tom
@property
- 目的
即想達到對象屬性私有化的目的
又想通過 對象.屬性 的方法來調用和修改私有化后的屬性
class PositiveInteger():def __init__(self):self.name = 'Tom'self.__age = 15@propertydef age(self):return self.__age@age.setterdef age(self, newage):if 0 < newage < 100:self.__age = newageelse:print('年齡不符合要求')def __str__(self):return '學生的年齡:{},學生的名字:{}'.format(self.__age, self.name)i = PositiveInteger()print(i, i.age) i.age = 99 print(i, i.age)學生的年齡:15,學生的名字:Tom 15
學生的年齡:99,學生的名字:Tom 99
面向對象–關聯關系
概念辨析
- is a
是一種繼承關系
A is a B B是A的基類(父類)
可以產生代碼上的重用性
比如:兔子 is a 動物
就是說兔子繼承了動物的一些特點:有腿、有耳朵
具體到代碼層面就是說:它可以繼承動物(父)類的一些屬性,如果有需要增加的可以再寫
兔子愛吃的素食有哪些,就是兔子類不能從動物類繼承的屬性,因為有些動物不吃素的
就可以在動物類的基礎上,添加喜歡吃的食物這一屬性
- has a
是一種包含關系
A has a B A包含B
比如:汽車 has a 輪胎,但是不能說汽車 is a 輪胎
包含關系具體到代碼層面就是調用
汽車有很多屬性:輪胎類型、車座類型、價格…
輪胎也有很多屬性:價格、材質、防滑等級…
汽車對象就可以調用輪胎對象里面的一些屬性
寶馬牌汽車的輪胎是米其林材質的,價格是…。防滑等級是…
實例理解
講的是 has a的包含關系
is a的繼承關系在后續有介紹
class Compter:def __init__(self,brand,type,color):self.brand=brandself.type=typeself.color=colordef online(self):print("正在使用電腦上網")def __str__(self):return self.brand + '-------'+self.type+'------'+self.colorclass Book:def __init__(self,bname,number,author):self.bname=bnameself.number=numberself.author=authordef __str__(self):return self.bname+self.author+self.numberclass sudent:def __init__(self,name,compter,book):self.name=nameself.compter=compterself.Book=[]self.Book.append(book)def __str__(self):return self.name+'------->'+str(self.compter)+'-----'+str(self.Book)C=Compter('mac','pro','深灰色') print(C) print(type(C))s = sudent('lilu', C, '盜墓筆記') print(s)mac-------pro------深灰色
<class ‘main.Compter’>
lilu------->mac-------pro------深灰色-----[‘盜墓筆記’]
面向對象–繼承關系
基本繼承
class person():def __init__(self, name, age):self.name = nameself.age = agedef run(self):print('{}歲的{}在跑步'.format(self.age, self.name))class sudent(person):def __init__(self, name, age, classes):super().__init__(name, age )self.classes = classesdef run(self, food):super().run()print('他是{}的,喜歡吃{}'.format(self.classes, food))s = person('lilu', 13) s.run()s = sudent('lilu', 14, '15班') s.run('漢堡')13歲的lilu在跑步
14歲的lilu在跑步
他是15班的,喜歡吃漢堡
- init問題
- 對象方法
- 注意
父類中私有的屬性,子類是無法繼承的
多重繼承
- https://www.cnblogs.com/xpc51/p/11764975.html
多重繼承的順序問題在Python2有這個問題
在Python3中沒有這個問題
面向對象–多態
多態介紹
# 封裝 繼承 多態 ----》 面向對象 class Person:def __init__(self, name):self.name = namedef feed_pet(self, pet): # pet既可以接收cat,也可以接收dog,還可以接收tiger# isinstance(obj,類) ---》 判斷obj是不是類的對象或者判斷obj是不是該類子類的對象if isinstance(pet, Pet):print('{}喜歡養寵物:{},昵稱是:{}'.format(self.name, pet.role, pet.nickname))else:print('不是寵物類型的。。。。')class Pet:role = 'Pet'def __init__(self, nickname, age):self.nickname = nicknameself.age = agedef show(self):print('昵稱:{},年齡:{}'.format(self.nickname, self.age))class Cat(Pet):role = '貓'def catch_mouse(self):print('抓老鼠....')class Dog(Pet):role = '狗'def watch_house(self):print('看家高手....')class Tiger:def eat(self):print('太可怕了,可以吃人...')# 創建對象 cat = Cat('花花', 2)dog = Dog('大黃', 4)tiger = Tiger()person = Person('家偉')person.feed_pet(cat) person.feed_pet(dog) print('----------------------------') person = Person('pengpeng')person.feed_pet(tiger)# Pet # pet 父類 cat dog 子類 # pet 大類型 cat dog 小類型- python中沒有嚴格的多態,它的多態實現是通過 isinstance() 函數來實現的
即不能分辨接受對象所屬的類型,所有類型的對象都可以接受
但是可以通過isinstance()函數,來分辨對象的類型,從而做出不同的動作
總結–多態、繼承、封裝
- 基本概念
封裝
根據功能將屬性和方法封裝在一個個類中,然偶基于這些類來創建對象
有些屬性不希望外界隨便更改,就給私有化
留有接受和改變該屬性的方法
但是改變有條件,通過寫在改變該屬性的方法里面
繼承
降低代碼的冗余度,實現了代碼的復用
多態
不同對象調用同一個方法,可能產生不同的結果
python中沒有嚴格的多態,主要是通過isinstance()函數來實現對象類型的判斷分別
- 參考文獻
https://www.jianshu.com/p/f78cab5deb9a
https://blog.csdn.net/simuLeo/article/details/80067619
https://www.liujiangblog.com/course/python/44
https://blog.csdn.net/weixin_48261286/article/details/113747011
總結
以上是生活随笔為你收集整理的知识点 —— Python进阶-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python return break_
- 下一篇: javascript实现俄罗斯方块