Python之物件導向程式設計

2021-09-11 13:13:13 字數 4776 閱讀 5355

#類和物件

類是抽象的模板,比如我們抽象乙個學生類,很容易想到學生固有的一些屬性,比如名字,年齡等等,建立乙個學生類:

class student(object):

pass

複製**

這裡的object是表明student類是從哪個類繼承來的,在python中object是所有類的父類(繼承的概念下文會提及)

建立例項物件tom:

tom = student()

//我們可以自由地給類繫結屬性:

tom.name = 'xiaoming'

tom.age = 23

複製**

那麼既然類具有模板的作用,所以我們可以把一些屬性強行繫結給類

class  newstudent(object):

def init(self,name,age):

self.name = name

self.age = age

複製**

這裡需要注意一點__init__方法的第乙個引數永遠是self,表示建立的例項本身,因此,在__init__方法內部可以把各種屬性繫結到self。有了__init__方法,在建立例項的時候就不能傳入空的引數了,必須傳入與__init__方法匹配的引數,但是self不需要傳,python直譯器會自己把例項變數傳進去。

我們可以給類新增列印學生資訊的方法,把邏輯放在類內部,外部只需要呼叫即可:

class  newstudent(object):

def __init__(self,name,age):

self.__name = name

self.__age = age

def printinfo(self):

print('name:%s,age:%s'%(self.__name,self.__age))

john = newstudent('john',32)

//類外部呼叫:

john.printinfo()

複製**

#訪問限制 在上面的**中,我們雖然把屬性方法寫在了類的內部,實際上,我們從外面還是能夠對他進行修改的,python中在屬性的名字前面加雙下劃線就使屬性變成了私有,外部不能訪問也不可更改。

class  newstudent(object):

def __init__(self,name,age):

self.__name = name

self.__age = age

複製**

如果我們有想要獲取想要更改怎麼辦呢?可以通過get set方法:

class  newstudent(object):

def __init__(self,name,age):

self.__name = name

self.__age = age

def printinfo(self):

print('name:%s,age:%s'%(self.__name,self.__age))

def get_name(self):

return self.__name

def get_age(self):

return self.__age

def set_name(self,name):

self.__name = name

def set_age(self,age):

self.__age = age

john.set_name('haha')

john.set_age(10)

print(john.get_name())

print(john.get_age())

複製**

至於為什麼這麼折騰呢?寫成私有變數的好處就是我允許外部訪問或修改,但是我內部是有判斷的。

#繼承和多型 在oop程式設計中,我們定義乙個類的時候,可以從現有的類繼承;新的類就稱為子類,而被繼承的類就是父類,基類或超類。

class animal(object):

def run(self):

print('animal is running...')

def eat(self):

print('animal is eating...')

class dog(animal):

pass

class cat(animal):

pass

複製**

上面的三個類,animal就是dog和cat的父類,那麼繼承有什麼好處呢?

dog = dog()

cat = cat()

dog.run()

cat.run()

//animal is running...

//animal is running...

複製**

從上面的**可以看出,子類繼承了父類的全部方法(功能);

當然子類也可以擁有自己的方法:

class animal(object):

def run(self):

print('animal is running...')

def eat(self):

print('animal is eating...')

class dog(animal):

def run(self):

print('dog is running...')

def bark(self):

print('dog is barking...')

class cat(animal):

def run(self):

print('cat is running...')

def jump(self):

print('cat is jumping...')

dog = dog()

cat = cat()

dog.run()

dog.eat()

dog.bark()

cat.run()

cat.eat()

cat.jump()

複製**

繼承還有乙個好處就是,子類可以對父類的方法進行重寫,當子類和父類都有同樣的方法時,子類會覆蓋父類的方法,這就是繼承的另乙個好處:多型

多型其實講了乙個現實生活很常見的現象,那就是狗是動物,貓也是動物,但是動物不是狗,動物也不是貓;繼承導致了dog和cat類有了兩種型別,這是乙個很重要的功能

比如我們定義乙個方法:

def run_twice(animal):

animal.run()

animal.run()

run_twice(animal())

複製**

當我們傳入animal例項就會執行兩次run方法

run_twice(dog())

run_twice(cat())

複製**

當我們傳入子類物件的時候,子類物件也會執行兩次類方法

#獲取物件資訊 當我們拿到乙個物件的引用,如何知道這個物件是什麼型別有什麼方法?

##使用type()

print(type(123) == int)

print(type('123') == str)

複製**

判斷基本型別可以直接寫int,str,但是如果要判斷物件是不是函式呢?

import types

def function():

pass

print(type(function) == types.functiontype)

print(type(lambda x: x*x) == types.lambdatype)

print(type((x for x in range(10)))==types.generatortype)

print(type(abs)==types.builtinfunctiontype)

複製**

##使用isinstance()

a = animal()

d = dog()

c = cat()

print(isinstance(a,animal))

print(isinstance(d,animal))

print(isinstance(d,dog))

複製**

##使用dir() dir()返回乙個包含字串的list

dir('123')

//可以獲取str物件的所有屬性和方法

複製**

類似__***__的屬性和方法在python中都是有特殊用途的,比如__len__方法返回長度。在python中,如果你呼叫len()函式試圖獲取乙個物件的長度,實際上,在len()函式內部,它自動去呼叫該物件的__len__()方法,所以,下面的**是等價的:

len('123')

'123'.__len__()

//執行結果:

//3複製**

淡然僅僅把屬性和方法列出來是不夠的,還有配合getattr()、setattr()以及hasattr(),我們就可以直接操作乙個物件的狀態。

#最後 物件導向其實有很多知識點可以寫,我只是做乙個摘要而已,希望自己能堅持下去吧~

python之物件導向程式設計

物件導向的程式設計的核心是物件 上帝式思維 要理解物件為何物,必須把自己當成上帝,上帝眼裡世間存在的萬物皆為物件,不存在的也可以創造出來。物件是特徵和技能的結合,其中特徵和技能分別對應物件的資料屬性和方法屬性。優點是 解決了程式的擴充套件性。對某乙個物件單獨修改,會立刻反映到整個體系中,如對遊戲中乙...

python之物件導向程式設計

當使用 類名 實參 建立例項物件時,python直譯器的主要處理過程包括兩大步 首先會查詢該類物件是否實現了特殊方法 new 如果沒有實現,則去其父類中依次查詢,直到類物件object。class parent object def new cls,args,kwargs pass class ch...

Python之物件導向程式設計介紹

面向過程 procedure oriented 是一種以過程為中心的程式設計思想。這些都是以什麼正在發生為 目標進行程式設計,不同於物件導向的是誰在受影響。與物件導向明顯的不同就是封裝 繼承 類。例如 五子棋,面向過程的設計思路就是首先分析問題的步驟 1 開始遊戲,2 黑子先走,3 繪製畫面,4 判...