面向過程:把電腦程式視為一系列的命令集合,一組函式順序執行,先做什麼再做什麼
物件導向:把電腦程式視為一系列物件的集合,a要做什麼b要做什麼
class是一種抽象概念,比如我們定義的class——student,是指學生這個概念
而例項(instance)則是乙個個具體的student,比如,bart simpson和lisa simpson是兩個具體的student。
class既包含資料,又包含運算元據的方法
class
student
(object):
#class 類名首字母大寫(繼承的類)沒有合適的繼承類寫object
def__init__
(self, name, score)
:#強制繫結預設屬性 name score
#第乙個引數永遠為self,表示建立的例項本身,即指向每乙個例項
self.__name = name #屬性前加兩個下劃線,變為私有變數,外部不可訪問、修改
self.__score = score#前後都有雙下劃線的是特殊變數,不是private,可以訪問、修改
defget_name
(self)
:#所有內部函式的第乙個變數都是self
return self.__name
defget_score
(self)
:return self.__score
defset_score
(self,new_score):if
0<= new_score <=
100:
self.__score = new_score
else
:return
'請輸入正確的分數'
#以上這種讀寫方式可以用@property和@***.setter得到簡化
bart = student(
'bart simpson',59
)#把屬性綁到bart這個例項身上
bart.age =
8#可以通過這種方式任意繫結屬性 #通過slots限制
lisa = student(
'lisa simpson',87
)lisa.gender =
'female'
#同一類的不同例項可以擁有不同的屬性
print
('%s\'s grade is %s'
%(lisa.__name, lisa.get_grade())
)
class
animal
(object):
defrun
(self)
:print
('animal is running...'
)class
dog(animal)
:#子類可以直接繼承,也可以覆蓋書寫+新增特性
defrun
(self)
:print
('dog is running...'
)def
run_twice
(animal)
:#animal是一種資料型別,dog作為其子類,也屬於animal。即dog也屬於animal的乙個例項
animal.run(
) animal.run(
)class
cat(animal)
:def
run(self)
:print
('cat is running...'
)run_twice(cat())
#只要繼承了animal的型別,就可以不需要修改runtwice函式,直接對子類呼叫即可
#對擴充套件開放:允許新增animal子類
#對修改封閉:不需要修改依賴animal型別的run_twice()等函式
class
timer
(object):
defrun
(self)
:print
('start...'
)run_twice(timer())
#python為動態語言,即使傳入的引數型別不是animal,反正只要是可以執行run.()就可以
使用type()print
(type
(123))
#返回的是
import types#匯入types模組,可查詢函式/生成器等型別
deffn()
:pass
print
(type
(fn)
==types.functiontype)
print
(type
(abs
)==types.builtinfunctiontype)
print
(type
(lambda x: x)
==types.lambdatype)
print
(type
((x for x in
range(10
)))==types.generatortype)
使用isinstance()
總是優先使用isinstance()判斷型別
class
animal
(object):
pass
class
dog(animal)
:pass
class
husky
(dog)
:pass
a = animal(
)b = dog(
)c = husky(
)print
(isinstance
(c,(animal,dog,husky)))
#滿足三者之一就輸出true
dir()
獲取物件的所有屬性(屬性+方法)
class
testobject
(object):
def__init__
(self)
: self.x =
9def
power
(self)
:return self.x * self.x
obj = testobject(
)#以下為命令列操作,真正python要寫print才有輸出
hasattr
(obj,
'x')
#has attribute屬性,obj是否有 x 屬性?
hasattr
(obj,
'y')
setattr
(obj,
'y',19)
#為obj設定屬性y,且其值為19
getattr
(obj,
'y')
function =
getattr
(obj,
'power'
)function(
)#輸出81
class
student
(object):
name =
'www'
#給student這個類 定義乙個name屬性 具體為乙個字串'www'
s = student(
)print
(s.name)
#s沒有name屬性,會去搜尋類屬性,輸出'www'
s.name =
'bob'
print
(s.name)
#例項的屬性高於類屬性,如果有屬於自己的例項屬性,就不會再去輸出類屬性
#practice
class
student
(object):
count =
0def
__init__
(self,name)
: self.name = name
student.count = student.count +
1#不可以直接count = count+1 count是類屬性,不是乙個單純的「變數」
c 物件導向程式設計 物件導向
什麼是物件導向 是對現實世界理解和抽象的方法。物件導向程式設計的特點 易維護,易擴充套件,靈活性好,重用 類 對事物的抽象定義,即事物具有的共同特徵和行為。物件 即對類進行例項 類是抽象的,物件是具體的 類的定義 語法 訪問修飾符 class 類名類的成員 包括字段,屬性,方法,常量,事件和索引器等...
物件導向程式設計
物件導向程式設計 抽象 封裝 繼承 多型 單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因。開放封閉原則 軟體實體應該可以擴充套件,但是不可修改。所有的設計模式都是對不同的可變性進行封裝,從而使系統在不同的角度上達到開發封閉原則。依賴倒轉原則 a 高層不應該依賴低層,兩個都應該依賴抽象。b ...
物件導向程式設計
class team def init self self.name tampa bay buccaneers bucs team print bucs.name tampa bay buccaneers 當呼叫team 函式時,會自動呼叫init函式,self是自動傳入到init中的引數,它指向當...