python之路 物件導向

2021-07-08 14:24:30 字數 4874 閱讀 6290

不了解什麼是物件導向,就無法更好的掌握python

python既支援面向過程的程式設計也支援物件導向的程式設計。

面向過程:程式是由過程或僅僅是可重用**的函式構建起來的。

物件導向:程式是由資料和功能組合而成的物件構建起來的。

物件導向中兩個重要的概念是類和物件。

類是對事物的抽象,比如說」人類」.物件是具體的事物。比如具體的某個」人」

何謂類?

在了解類之前,先回顧下初學python時的一句非常重要的話

一切皆物件。

那麼是什麼是pythong中的物件呢?

every object has an identity, a type and a value.

官方文件裡面有這樣一句話,說python中的每個物件都有乙個

id type

value

所以我們常用的字串,列表等都是物件

在python中,把具有相同屬性和方法的物件歸為乙個類(class)

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之路 物件導向之多型

什麼是多型 一種事物具有多種形態,如水具有液態水,氣態水.多型性 多型性分為動態多型性與靜態多型性 靜態多型性 任何資料型別都可以使用運算子 進行運算,而運算的結果是不同的 運算子的意義取決於被操作物件 動態多型性 繼承乙個類的多個子類中擁有相同的方法名,那麼這些子類產生的物件就可以不用考慮具體的型...