不了解什麼是物件導向,就無法更好的掌握python
python既支援面向過程的程式設計也支援物件導向的程式設計。
面向過程:程式是由過程或僅僅是可重用**的函式構建起來的。
物件導向:程式是由資料和功能組合而成的物件構建起來的。
物件導向中兩個重要的概念是類和物件。
類是對事物的抽象,比如說」人類」.物件是具體的事物。比如具體的某個」人」
何謂類?
在了解類之前,先回顧下初學python時的一句非常重要的話在python中,把具有相同屬性和方法的物件歸為乙個類(class)一切皆物件。
那麼是什麼是pythong中的物件呢?
every object has an identity, a type and a value.
官方文件裡面有這樣一句話,說python中的每個物件都有乙個
id type
value
所以我們常用的字串,列表等都是物件
class
person():
# 我們每乙個人都是乙個物件,我們具有相同屬性和方法所以歸為人"類"
# 這個類擁有的靜態欄位為star,靜態字段可以由類來直接進行訪問,比如person.star
# 擁有的普通方法為 introdece_self,包含有乙個self,因為這個self將會在呼叫該方法的時候,把呼叫的物件返回給self,然後就可以使用這個物件的字段了,比如self.name
star = "earth"
def__init__(self,name,age):
# 構造方法,初始化例項的時候執行
self.name = name
self.age = age
defintroduce_self(self):
#人類所擁有的乙個方法
print "my name is %s ,my age is %s"
%(self.name,self.age)
# 類的屬性 (還有其他定義類的屬性的方法)
@property
defattr_p(self):
return
"this is a class attr"
# 類的屬性呼叫的時候不用加括號。
# 類的普通方法呼叫的時候需要加上括號。
類的特性
繼承 封裝 多型
繼承從字面意思上來講就是從基類得到某些東西。
比如上面的」人類」可以是從」動物類」繼承某些屬性。
class
animals
():# 動物類
pass
class
person
(animals):
# 從動物類繼承的人類
# 繼承之後,可以使用基類的方法和屬性。
以上只是簡單的單繼承,但是python中支援多繼承哦。
#python中有兩種類
#經典類
class
per:
pass
# 新式類,新式類繼承object
class
new(object):
pass
# 經典類和新式類在多繼承的時候有一點點區別。
比如經典類
class
a:def
show():
print "a"
class
b(a):
defshow():
print "b"
class
c():
defshow():
print "c"
class
d(b,c):
pass
d1=d()
# 在這裡d類繼承了b和c,b又繼承了a。a b c裡面都有show方法。
# 當呼叫show方法的時候,先按照繼承順序,先從b裡面找。b裡面如果沒有,那麼找a裡面。a如果沒有再找c裡面。這叫深度優先。
# 新式類
class
a(object):
defshow():
print "a"
class
b(a):
defshow():
print "b"
class
c(a):
defshow():
print "c"
class
d(b,c):
pass
d2 = d()
# 上面的是新式類的範例。當b c都繼承自乙個新式類a。d繼承了b c.按照繼承順序,如果d要找乙個方法,先去b裡面找。如果b裡面沒有,再去c裡面找。c裡面如果沒有再去a裡面找。這叫廣度優先。(注意,c必須和d一樣繼承a類才適用廣度優先)
多型
多型也可以從」動物類」和」人類」這來舉例,
比如動物原來的某個屬性,到」人類」就已經發生變化(變異),
最終」人類」可以保持自己的多樣性.
封裝物件導向的封裝來說,其實就是使用構造方法將內容封裝到 物件 中,然後通過物件直接或者self間接獲取被封裝的內容。
封裝是物件導向中非常重要的內容
封裝就是把內容封起來,然後再去呼叫。
class
person
(object):
def__init__
(self,name,age):
self.name = name
self.age = age
defshow
(self):
print self.name
print self.age
# 比如上面這個類就是把name和age封裝起來了。
# 呼叫的時候可以直接用例項化的物件來呼叫
# 也可以通過self來呼叫。show方法就是用self來呼叫封裝的內容的。
物件導向之 self# 還是用上面這個例子來說
class
person
(object):
def__init__
(self,name,age):
self.name = name
self.age = age
defshow
(self):
print self.name
print self.age
p1 = person("hansz",22)
# 上面的例子定義了乙個類person,並且例項化了乙個物件p1
# 我們來看定義類的時候,首先繼承object。是新式類。
# 然後定義構造方法。注意構造方法的三個引數。第乙個self。
# self的意思是自己。當例項化物件的時候,構造方法傳進來的self是物件自己。構造方法就相當於p1.name="hansz" p1.age=22
# 下面的show方法之所以要傳入self。是因為他傳入之後就可以直接使用物件的屬性了。print p1.name
字段
首先是字段,類裡面的字段分為靜態字段和普通字段。
靜態字段 是屬於類的 在記憶體中只有乙份
普通字段 是屬於物件的 每個物件都有乙份
比如
class
city
(object):
province = "甘肅"
def__init__
(self,city_name):
self.city_name = city_name
wuwei = city("武威")
# 上面這個類裡面province 是類的字段。也就是靜態字段。是可以直接通過類訪問的。比如city.province 當然,也可以通過物件來訪問。wuwei.province
方法
普通方法
之前說的都是普通方法。
類方法和靜態方法
類方法,和靜態字段一樣,是直接可以用類來呼叫的。
靜態方法,由類呼叫,無缺省引數。
class
a(object):
deftest
():pass
@classmethod
defclass_m
(cls):
# 至少有乙個cls引數。
print
"this is a class method ."
@staticmethod
defstatic_m
():print
"this is a static method"
# 上面寫了乙個簡單的類方法 和靜態方法
# 實現類方法和靜態方法需要python語法糖@ 。也就是裝飾器。
方法呼叫者不通,呼叫時傳入的引數不同,
屬性
class
a:def
func
(self):
pass
# 定義屬性
@property
defprop
(self):
pass
# 例項化物件
foo_obj = foo()
foo_obj.func()
foo_obj.prop #呼叫屬性
# 屬性可以看作是方法的一種,但是屬性呼叫的時候,又不用加括號。
# 屬性存在意義是:訪問屬性時可以製造出和訪問字段完全相同的假象
屬性的兩種定義方式 Python學習之路 物件導向
物件導向 物件導向的程式設計的核心是物件 相當於你要處於創造者的思維來建立乙個新的東西,如你要實現什麼東西,需要幹什麼才能創造出來 要理解物件為何物。物件導向的程式設計好比作者寫 作者要解決的問題就是使主角從乙個屌絲公升級到大神的故事,作者覺得要讓主角成為大神,會給主角鋪墊從弱到強的大綱,主角很弱時...
python自學之路 物件導向
定義 指類中無需例項參與即可呼叫的方法 不需要self引數 在呼叫過程中,無需將類例項化,直接在類之後使用.號運算子呼叫方法。用法 靜態方法使用 staticmethod裝飾器來宣告 class classa object staticmethod def func a print hello py...
python之路 物件導向之多型
什麼是多型 一種事物具有多種形態,如水具有液態水,氣態水.多型性 多型性分為動態多型性與靜態多型性 靜態多型性 任何資料型別都可以使用運算子 進行運算,而運算的結果是不同的 運算子的意義取決於被操作物件 動態多型性 繼承乙個類的多個子類中擁有相同的方法名,那麼這些子類產生的物件就可以不用考慮具體的型...