Python學(xué)習(xí)15-面向?qū)ο?/h2>
查看所有Python相關(guān)學(xué)習(xí)筆記

面向?qū)ο?/h2>
  • 面向?qū)ο笾R(shí)點(diǎn)匯總:
1. 獲取屬性:  
    > 1-實(shí)例對(duì)象.屬性  ---    . 是調(diào)用的意思  
    > 2-類屬性(靜態(tài)屬性)---這個(gè)屬性是屬于所有類的對(duì)象    
         1-對(duì)象.屬性         
         2-類.屬性
2. 初始化方法===構(gòu)造方法--```def ____init__(self):```
    > 作用:只要?jiǎng)?chuàng)建實(shí)例,就會(huì)被調(diào)用
3. self--本身--->指實(shí)例的本身--->t1   --t1 = Tiger(200)
    > 可以改其他字符 ---但不建議改--->規(guī)范
4. 實(shí)例方法:
    > 定義:def tell(self):----self 是具體的調(diào)用實(shí)例  
    > 作用:每個(gè)實(shí)例個(gè)體都有自己的輸出
5. 靜態(tài)方法==類方法
    @staticmethod 修飾,沒有self
6. from  random import randint #取隨機(jī)---
    > 要點(diǎn):游戲-每一次的彈出的房間號(hào)是隨機(jī)的
        2-randint(0,2)可以?。?0,1,2  閉區(qū)間
7. 計(jì)算游戲時(shí)間:time.time()---秒
8. 繼承:
    class SouthTiger(Tiger,WonTiger):#括號(hào)內(nèi)是 多個(gè)或一個(gè)父類名
9. 子類對(duì)象調(diào)用父類被重寫的方法:
    super(SouthTiger,h1).roar()
  • 面向?qū)ο?
    • 靜態(tài)屬性
    • 實(shí)例屬性(self)
    • 靜態(tài)方法(@staticmethod)(可以訪問靜態(tài)屬性:類名.屬性)(不可以訪問實(shí)例屬性)
    • 實(shí)例方法(self)(可以訪問實(shí)例屬性:self.屬性)
    • 類方法(cls)(@classmethod)(不可以訪問實(shí)例屬性)(使用較少,基本不用)
    class Tiger:
        '老虎'
        classname = 'tiger'#靜態(tài)屬性
        def __init__(self,weight = 200):#實(shí)例屬性
            self.weight = weight
        def tellWeight(self):#實(shí)例方法
            print( f'my weight is {self.weight}')
        def roar(self):
            print('wow!!!')
            self.weight -= 5
        @staticmethod # 靜態(tài)方法
        def roar2():
            print(Tiger.classname)
    
  • 對(duì)象的繼承
    class SubClassName (ParentClass1[,ParentClass2]):
        pass
    
    class NeTiger(Tiger):
        '繼承虎'
        color = 'red'
        classname= 'dongbei tiger'
        def __init__(self,weight=200):
            Tiger.__init__(self,weight) #調(diào)用父類的初始化方法
        @staticmethod
        def jump():
            print('兩米高')
    

類和對(duì)象

對(duì)象對(duì)象 = 屬性 + 方法

Python中的類名約定以大寫字母開頭
Python中的函數(shù)名約定以小寫字母開頭

面向?qū)ο蠛?jiǎn)介OO=Object Oriented

  • 封裝 信息隱蔽技術(shù)
  • 繼承 繼承是子類自動(dòng)共享父類之間數(shù)據(jù)和方法的機(jī)制
# Mylist繼承了list的方法和屬性
class Mylist(list):
    pass
list2 = Mylist()
list2.append(5)
print(list2)
# 執(zhí)行結(jié)果
[5]
  • 多態(tài) 名字一樣,實(shí)現(xiàn)不一樣
    “多態(tài)”部分內(nèi)容概念理解錯(cuò)誤,后期調(diào)整,請(qǐng)暫時(shí)略過
class A:
    def fun(self):
        print('我是A')
class B:
    def fun(self):
        print('我是B')
a = A()
b = B()
a.fun()
b.fun()
# 執(zhí)行結(jié)果
我的A
我的B

面向?qū)ο缶幊?/h4>

OOA:面向?qū)ο蠓治?br> OOD:面向?qū)ο笤O(shè)計(jì)
OOP:面向?qū)ο缶幊?/p>

  • self是什么?

Python的self相當(dāng)于C++的this指針
同一個(gè)類可以生成無(wú)數(shù)個(gè)對(duì)象,self相當(dāng)于門牌號(hào)

class Ball:
    def setName(self,name):
        self.name = name
    def kick(self):
        print('我叫%s,該死的,誰(shuí)踢我...' % self.name)
a = Ball()
a.setName('球A')
b = Ball()
b.setName('球B')
c = Ball()
c.setName('土豆')
a.kick()
c.kick()
# 執(zhí)行結(jié)果
我叫球A,該死的,誰(shuí)踢我...
我叫土豆,該死的,誰(shuí)踢我...
  • 構(gòu)造方法__init__(self,param1,param2...) Python的魔法方法
class Ball:
    def __init__(self,name='qiu'):
        self.name = name
    def kick(self):
        print('我叫%s,該死的,誰(shuí)踢我...' % self.name)
a = Ball('球A')
b = Ball()
c = Ball('土豆')
a.kick()
b.kick()
c.kick()
# 執(zhí)行結(jié)果
我叫球A,該死的,誰(shuí)踢我...
我叫qiu,該死的,誰(shuí)踢我...
我叫土豆,該死的,誰(shuí)踢我...
  • 公有和私有偽私有

在Python中定義私有變量只需要在變量名或函數(shù)名前加上“”兩個(gè)下劃線,那么這個(gè)函數(shù)或變量就變?yōu)樗接械牧?br> 私有后必須使用內(nèi)部方法調(diào)用或通過'類名_變量名'來(lái)訪問

class Person:
    __name = '測(cè)試'
    def getName(self):
        return self.__name
p = Person()
a = p.getName()
print(a)
# 執(zhí)行結(jié)果
測(cè)試
測(cè)試

繼承

單繼承
class DerivedClassName(BaseClassName):
    pass

BaseClassName 被繼承的類:基類、父類、超類

  • 子類可以調(diào)用父類方法
class Parent:
    def hello(self):
        print('正在調(diào)用父類的方法')
class Child(Parent):
    pass
p = Parent()
p.hello()
c = Child()
c.hello()
# 執(zhí)行結(jié)果
正在調(diào)用父類的方法
正在調(diào)用父類的方法
  • 子類重寫了父類的方法,將會(huì)覆蓋掉父類的方法
# 例一:
class Parent:
    def hello(self):
        print('正在調(diào)用父類的方法')
class Child(Parent):
    def hello(self):
        print('正在調(diào)用子類的方法')
p = Parent()
p.hello()
c = Child()
c.hello()
# 執(zhí)行結(jié)果
正在調(diào)用父類的方法
正在調(diào)用子類的方法
# 例二
import random as r

class Fish:
    def __init__(self):
        self.x = r.randint(1,10)
        self.y = r.randint(1,10)
    def move(self):
        self.x -= 1
        print('我的位置是:',self.x,self.y)
class Goldfish(Fish):
    pass
class Carp(Fish):
    pass
class Shark(Fish):
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print('吃貨的夢(mèng)想就是天天有的吃?。?!')
        else:
            print('太撐了,吃不下了!')
print('調(diào)用父類.......................')
fish = Fish()
fish.move()
fish.move()
print('子類未重寫,可調(diào)用父類的move.....')
goldfish = Goldfish()
goldfish.move()
goldfish.move()
print('子類已重寫,不可調(diào)用父類的move...')
shark = Shark()
shark.eat()
shark.eat()
# shark.move() # AttributeError: 'Shark' object has no attribute 'x'
# 執(zhí)行結(jié)果
調(diào)用父類.......................
我的位置是: 7 2
我的位置是: 6 2
子類未重寫,可調(diào)用父類的move.....
我的位置是: 2 9
我的位置是: 1 9
子類已重寫,不可調(diào)用父類的move...
吃貨的夢(mèng)想就是天天有的吃!?。?太撐了,吃不下了!

  • 重寫父類方法是想繼續(xù)保持父類方法不被覆蓋,可以采用以下兩種方法
    • 調(diào)用未綁定的父類方法(需要使用父類的名字)
    import random as r
    class Fish:
        def __init__(self):
            self.x = r.randint(1,10)
            self.y = r.randint(1,10)
        def move(self):
            self.x -= 1
            print('我的位置是:',self.x,self.y)
    class Goldfish(Fish):
        pass
    class Carp(Fish):
        pass
    class Shark(Fish):
        def __init__(self):
            self.hungry = True
            Fish.__init__(self)  # 調(diào)用未綁定的父類方法
        def eat(self):
            if self.hungry:
                self.hungry = False
                print('吃貨的夢(mèng)想就是天天有的吃!??!')
            else:
                print('太撐了,吃不下了!')
    shark = Shark()
    shark.move() 
    # 執(zhí)行結(jié)果
    我的位置是: 9 6 # move方法調(diào)用成功
    
    • 使用super函數(shù)(不用給出任何父類的方法)
    import random as r
    
    class Fish:
        def __init__(self):
            self.x = r.randint(1,10)
            self.y = r.randint(1,10)
        def move(self):
            self.x -= 1
            print('我的位置是:',self.x,self.y)
    class Goldfish(Fish):
        pass
    class Carp(Fish):
        pass
    class Shark(Fish):
        def __init__(self):
            self.hungry = True
            super().__init__()  # 使用super
        def eat(self):
            if self.hungry:
                self.hungry = False
                print('吃貨的夢(mèng)想就是天天有的吃?。?!')
            else:
                print('太撐了,吃不下了!')
    shark = Shark()
    shark.move() 
    # 執(zhí)行結(jié)果
    我的位置是: 7 5
    
多繼承,既可以調(diào)用父類1的方法也可以調(diào)用父類2的方法
class Base1:
    def foo1(self):
        print('我的foo1,我未Base1代言')
class Base2:
    def foo2(self):
        print('我的foo2,我未Base2代言')
class C(Base1,Base2):
    pass
c = C()
c.foo1()
c.foo2()
# 執(zhí)行結(jié)果
我的foo1,我未Base1代言
我的foo2,我未Base2代言

組合

把類和實(shí)例化放到一個(gè)新的類里
把沒有繼承關(guān)系的類放到一起
補(bǔ)充:Mix-in

class Trutle:
    def __init__(self,x):
        self.num = x
class Fish:
    def __init__(self,x):
        self.num = x
class Pool:
    def __init__(self,x,y):
        self.trutle = Trutle(x)
        self.fish = Fish(y)
    def print_num(self):
        print('水池總共有烏龜%d只,小魚%d只' %(self.trutle.num,self.fish.num))
pool = Pool(4,5)
pool.print_num()
# 執(zhí)行結(jié)果
水池總共有烏龜4只,小魚5只

類、類對(duì)象、實(shí)例對(duì)象

  • 屬性的名字跟方法名相同,屬性會(huì)覆蓋方法
  • 不要試圖在一個(gè)類里面定義出所有能想到的特性和方法,應(yīng)該利用繼承和組合機(jī)制來(lái)進(jìn)行擴(kuò)展
  • 用不同的詞性命名,如屬性名用名詞,方法名用動(dòng)詞

什么是綁定self

Python嚴(yán)格要求方法需要有實(shí)例才能被調(diào)用,這種限制其實(shí)就是Python所謂的綁定概念。

實(shí)例化后,即使刪除類,原來(lái)實(shí)例化的對(duì)象任然有效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容