1. 程式人生 > >Python 類和對象-上

Python 類和對象-上

ima 類型 strong 對象 glin ida clas count als

#類和對象 
class
Human: #屬性 -> 成員屬性(變量) ear = 2 mouth = 1 sex = man age = 28 name = zhangwang married = False color = yellow #特征 -> 成員方法(函數) def walk(self): print(直立行走) def eat(self): print(吃飯) def sleep(self): print
(睡覺) def playgame(self): print(打遊戲) #查看類的值 print(Human) #類的類型 print(type(Human)) #實例化對象操作 wangwang = Human() #打印對象的值 print(wangwang) #打印對象的類型 print(type(wangwang)) #檢測類的成員(在類中聲明的成員都可以看到) print(Human.__dict__) #檢測對象中的成員 print(wangwang.__dict__) print(wangwang.sex)
class GF:
#屬性 sex = age = 18 height = 170 weight = 50kg threeWei = (36E,2.1,108CM) #方法 def guang(self): print(guang) def eat(self): print(chi) def cry(self): print(wu) #類的基本操作 #訪問 print(GF.sex)#屬性 GF.eat(1)#方法 #修改 print(GF.age) GF.age
= 22#屬性 print(GF.__dict__) #定義一個函數 ‘‘‘ def mycry(): print(‘Do not cry‘) GF.cry = lambda :print(‘啊嗚‘)#方法 GF.cry = mycry#方法 GF.cry() ‘‘‘ #添加 GF.hobby = act#屬性 print(GF.__dict__) GF.upsky = lambda : print(upsky)#方法 GF.upsky() #刪除 del GF.threeWei print(GF.__dict__) del GF.cry print(GF.__dict__) #對象的基本操作 bingbing = GF() print(bingbing.__dict__) #訪問 print(bingbing.sex)#屬性 bingbing.eat()#方法 #修改 bingbing.age = 28 #屬性 修改屬性只會影響當前對象本身 print(bingbing.__dict__) bingbing.cry = lambda : print(bigcry) print(bingbing.__dict__) bingbing.cry() #添加操作 bingbing.cloth = 一襲長裙#屬性 print(bingbing.__dict__) bingbing.walk = lambda : print(走紅毯)#方法 print(bingbing.__dict__) bingbing.walk() #刪除 bingbing.water = more bingbing.action = lambda : print(專業演員) print(bingbing.__dict__) del bingbing.water#屬性 del bingbing.action#方法 print(bingbing.__dict__)
#關於self ‘‘‘ 通過類調用的函數: 綁定類的方法 通過對象調用的函數: 非綁定類的方法 ‘‘‘ class Human: #屬性 age = 18 sex = female name = sanpao #方法 def eat(self): print(self)#通過類來調用的時候self只是函數的一個普通形參,必須給實參! print(吃西瓜) def drink(self): print(self)#通過對象調用的時候self接受的肯定是當前的對象!此處的self不是關鍵字 只是一個形參,名字可以修改,但是推薦用self print(喝西瓜汁) #綁定類的方法(肯定) def la(): print(puchi) #綁定類的方法/非綁定類的方法(取決於怎麽使用) def sa(arg): print(hualala) #通過類調用 Human.eat(nidaye) #通過對象調用 zw = Human zw.drink(1) #類來訪問sa方法(綁定類的方法) Human.sa(1) #通過對象方法sa方法(非綁定類的方法) zw.sa(1)
#人類 class Human: #屬性 age = 18 #私有化封裝成員屬性[只能在當前結構中使用] __sex = male color = yellow hair = black #方法 def say(self): print(ayi) def walk(self): print(sousou) #私有化成員方法(只能在當前類或者對象的結構中訪問) def __niao(self): print(xuxu) #測試:自己訪問自己的私有成員 def demo(self): #訪問私有方法niao self.__niao() print(測試私有成員的訪問) #實例化對象 tbw = Human() #調用tbw的成員 ‘‘‘ print(tbw.age) print(tbw.hair) print(tbw.color) tbw.say() tbw.walk() ‘‘‘ #相當於別人叫你的名字 想查看你的性別[私有化成員不可以在類/對象的當前結構外訪問] #print(tbw.sex) #tbw.niao() #訪問測試方法demo[私有化成員可以在類/對象的當前結構中訪問] #tbw.demo() #Python對私有成員的封裝實際上使用了改名策略(name mangling) print(Human.__dict__) print(tbw._Human__sex) tbw._Human__niao() print(Human._Human__sex) Human._Human__niao(1)
#繼承
#劉備類:父類 -> 被其他類繼承的類稱之為父類(超類,基類)
class LiuBei:
    #屬性
    familyname = 
    firsttime = 
    sex = man
    money = 100
    country = 蜀國
    wife = (甘夫人,糜夫人,孫尚香)
    #方法
    def say(self):
        print(險損我一員大將)

    #非綁定類的方法[對象訪問]
    def drink(self):
        print(self)
        print(來幹了這杯)

    def walk(self):
        print(gogo)

    #綁定類的方法
    def la():
        print(hualala)

#劉禪類:子類 -> 繼承其他類的類稱之為子類(派生類)
class LiuShan(LiuBei):
    #子類獨有的成員
    #屬性
    weight = 180斤

    #方法
    def douququ(self):
        print(此間樂,不思蜀)

    #重載父類方法
    def say(self):
        print(劉備baba)

    #重載父類的drink方法,但是還要將父類中操作拿過來使用
    def drink(self):
        print(舉起筷子,夾一口菜)
        #喝酒 通過對象調用的方法的重載(推薦使用super().方法名())
        super().drink() #LiuBei.drink(self)

    #重載父類的la方法,但是還要將父類中操作拿過來使用
    def la():
        print(準備好紙)
        #調用父類的la方法(推薦使用類名.方法名)
        LiuBei.la()

#查看劉禪類
print(LiuShan.__dict__)#繼承操作不會將成員直接復制到子類中
print(LiuShan.sex)
LiuShan.walk(1)
#print(LiuShan.wife)
‘‘‘
1.所有的類的父類都是object子類
2.子類繼承父類則可以訪問父類的所有成員.(私有成員除外)
3.子類繼承父類並不會將父類的所有成員復制到子類當中去,訪問父類成員是間接通過父類來訪問的(目的:節省資源)
4.子類可以具有自己獨有的屬性和方法
5.子類可以重載父類中的方法,只需要設置和父類指定成員相同的名稱即可實現重載,重載之後的成員,子類只會訪問當前類中的成員,而不會調用父類中同名的成員
6.子類中如果重載父類的方法,並且還想將重載的父類方法借調過來使用,可以在重載的方法中使用如下方法
[父類名.方法()](適合類)  或者  [super().方法()](適合對象)
‘‘‘
result = issubclass(type,object)
print(result)

#訪問子類獨有的成員
LiuShan.douququ(1)
print(LiuShan.weight)

#訪問繼承來的方法
LiuShan.say(1)

#訪問重載並且調用了父類的方法的方法
LiuShan.la()

ls = LiuShan()
ls.drink()


#Python語法中沒有受保護的語法,程序員約定一種操作來實現受保護 class Father: #屬性 sex = man #受保護的 _money = 1000 color = yellow #私有化 __wife = bingbing #方法 def eat(self): print(Father._money) print(吃吃吃) def niao(self): print(嘩嘩嘩) class Son(Father): #添加一個子類的方法用於測試子類中的訪問 def test(): #方式訪問父類中私有成員 #print(Father.wife) #print(Son.wife) #訪問父類中公共的成員 print(Son.color) #訪問受保護的成員 print(Son._money) Son.test() Father.eat(1) print(Father._money) #受保護的定義 ‘‘‘ 私有化:只能在類或者對象的結構中訪問 公共的:可以在任何位置訪問 受保護:可以在當前類或者對象 和子類或者子類對象中訪問 類內 子類中 類外部 私有化: √ × × 受保護: √ √ √(×類外部應該不能訪問) 公共的: √ √ √ ‘‘‘

#單繼承 class Biology: #屬性 life = 活的 #方法 def shengzhi(self): print(生育後代) class animal(Biology): #屬性 age = 18 #方法 def jiao(self): print(叫兩聲聽聽) class mammal(animal): #屬性 gen = 胎生 #方法 def weinai(self): print(幹了這杯奶) class Human(mammal): #屬性 name = 囡囡 def dapai(self): print(王炸) #實例化對象操作 zb = Human() zb.dapai() zb.weinai() zb.jiao() zb.shengzhi()
#多繼承 class GrandPa: def damajiang(self): print(大三元) class GrandMa: def doudizhu(self): print(飛機) class LaoLao: def dance(self): print(彎彎的河水天上來) class LaoYe: def zhajinhua(self): print(嘩嘩嘩) class PaPa: def zhuanqian(self): print(賺錢) class MaMa: def huaqian(self): print(花錢) class LaoWang: def fanqiang(self): print(FQ) class Son(LaoWang,MaMa,PaPa,LaoYe,LaoLao,GrandMa,GrandPa): def kengdie(self): print(我老子是劉備) #實例化對象 ls = Son() ls.kengdie() ls.fanqiang() ls.huaqian() ls.doudizhu() ls.dance() ls.damajiang() ls.zhajinhua() ls.zhuanqian()
#菱形繼承 ‘‘‘ 動物類 人類 鳥類 鳥人類 ‘‘‘ #動物類 class Animal: #屬性 pass #方法 def say(self): print(Animal張開嘴) print(Animal合上嘴) #人類 class Human(Animal): #屬性 pass #方法 def say(self): print(人類張開嘴) #調用動物類的say方法 super().say() print(人類合上嘴) #鳥類 class Bird(Animal): #屬性 pass #方法 def say(self): print(鳥類張開嘴) #調用動物類的say方法 super().say() print(鳥類合上嘴) #鳥人類 class Birdy(Human,Bird): #屬性 pass #方法 def say(self): print(鳥人類張開嘴) #鳥類的say Bird.say(self) #人類say Human.say(self) print(鳥人類合上嘴) #實例化鳥人對象 by = Birdy() by.say() #查看繼承關系的mro列表 result = Birdy.mro() print(result)
#mixin設計模式 #水果類 class Fruit: pass #南方水果類 class SouthFruit(Fruit): pass #北方水果類 class NorthFruit(Fruit): pass #北方禮物水果 class NorthGiftFruit(NorthFruit): pass #北方非禮物水果 class NorthNotGiftFruit(NorthFruit): pass #南方禮物水果 class SouthGiftFruit(SouthFruit): pass #南方非禮物水果 class SouthNotGiftFruit(SouthFruit): pass #蘋果 class Apple(NorthGiftFruit): pass # class Pear(NorthNotGiftFruit): pass #桔子 class Orange(SouthGiftFruit): pass #香蕉 class Banana(SouthNotGiftFruit): pass #多繼承 #mixin設計模式 #水果類 class Fruit: pass #南方類 class South: pass #北方類 class North: pass #禮物類 class Gift: pass #非禮物類 class NotGift: pass #蘋果類 class Apple(Fruit,North,Gift): pass # class Pear(Fruit,North,NotGift): pass #桔子 class Orange(Fruit,South,Gift): pass #香蕉 class Banana(Fruit,South,NotGift): pass

Python 類和對象-上