
查看所有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
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()
- 靜態(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)
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ì)象 = 屬性 + 方法
Python中的類名約定以大寫字母開頭
Python中的函數(shù)名約定以小寫字母開頭
# Mylist繼承了list的方法和屬性
class Mylist(list):
pass
list2 = Mylist()
list2.append(5)
print(list2)
# 執(zhí)行結(jié)果
[5]
名字一樣,實(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
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ì)象任然有效