[Python 3.x入門] 6. Python面向對象編程

面向對象編程:OOP


  • 對象的組成:

狀態:都是描述事物的名詞形式(唱,跳,rap)

行為:都是描述事物的動詞形式(身高,體重)

  • 抽象過程

是面向對象中的一種分析方法。

抽象過程就是要分析出對象都存在哪些自己的屬性(狀態)和方法(行為)

類就是類別的意思,同一類別的事物都會有共同的屬性(狀態)或方法(行為)

  • 對象

對象就是類的一個具體表現事物

任何對象都擁有相同的屬性和方法(即類中的所有屬性和方法)

每個對象的屬性或方法會有獨特的個性。

  • 面向對象的三大特性:

封裝:通過語句塊保護變量或對象的作用域,提高代碼的安全性

繼承:子類擁有父類的可訪問屬性和方法,提高代碼的重用性

多態:各種重載和重寫的機制,提高代碼靈活性。(Python沒有多態特性)

  • python面向對象的快速創建

創建類

class 類名稱():

創建對象

對象標識符 = 類名稱()

調用類當中的方法

對象標識符.方法()

  • 類當中的四種方法:

實例、類、靜態、普通

<code>class Demo():
\t\t\t\tdef instanceMethods(self,arg1,arg2):      #定義類的實例方法
\t\t\t\t\t\t\tpass
if __name__ == '__main__':
obj1 = Demo()                                        #創建一個obj1的對象
obj1.instanceMethods(1,2)                  #調用類中的方法
obj1.instanceMethods(1,2,3)                  # 報錯,對象調用,self不傳值
Demo.instanceMethods(1,2,3)               #不報錯,類調self傳值,形參與實參個數對應/<code>

  • 類和對象的使用入門:
<code>#構造方法的使用
class Person():
\t\t\t\tdef __init__(self):              #通過類創建對象時默認會執行的方法,不要手動調用
\t\t\t\t\t\t\t\tpass
\t\t\t\tdef __str__(self):               #當我們直接打印輸出對象的時候調用的,相當於Java的toString()
\t\t\t\t\t\t\t\treturn ''                   #對該方法的重寫
if __name__ == '__main__':
\t\t\t\tper = Person()
\t\t\t\tprint(per)
\t\t\t\tprint(per.__str__()) #  print(per)  與print(per.__str__())  效果相同

/<code>

  • 類的成員屬性
<code>class Person():
\t\t\t\tdef __init__(self,name,gender,age):     #定義屬性
\t\t\t\t\t\t\t\tself.name = name
\t\t\t\t\t\t\t\tself.gender = gender
\t\t\t\t\t\t\t\tself.age = age
if __name__ == '__main__':
\t\t\t\tper1 = Person()                                  #報錯,必須傳參
\t\t\t\tper = Person('zs','男',15)                    #傳值/<code>

  • 類變量和類方法
<code>class Demo():
\t\t\t\tclassVariable = '這是類中定義的變量,是類變量'
\t\t\t\tdef __init__(self):                           #這裡定義實例變量
\t\t\t\t\t\t\t\tself.instanceVariable = '這是在__init__構造方法中定義的變量,是成員變量'
 
@classmethod                          #定義類方法,在方法頭上標識這一句
def classMethod(cls,arg1):          #在方法參數列表中,第一個參數必須是cls
\t\t\t\tpass
 
if __name__ == '__main__':               #可以通過實例對象訪問類屬性,類方法,成員變量
obj1 = Demo()
print(obj1.classVariable)                #實例訪問類變量
print(obj1.instanceVariable)          #實例訪問實例變量
print(obj1.classMethod('hello world!'))    #實例訪問類方法


Demo.classVariable                       #類訪問類變量。類不能訪問實例變量。
Demo.classMethod('hello world !')   #類訪問類方法   。 /<code>
  • 靜態方法 staticmethod

可以理解為該類空間的一個函數

<code>class Demo():
\t\t\t\tclassVariable = '這是類變量'
\t\t\t\tdef __init__(self):
\t\t\t\t\t\t\t\tself.instanceVariable  = '這是實例變量'
\t\t\t\t#靜態方法中不能訪問類變量
@staticmethod                   #定義靜態方法上方需加上這一句
def staticMethod():     #定義靜態方法,沒有強制傳入第一個為cls或者self參數,可不傳參數
\t\t\t\tprint('這是靜態方法')
if __name__ == '__main__':
obj1 = Demo()
obj1.staticMethod()             #通過實例變量調用靜態方法
Demo.staticMethod()         #通過類調用靜態方法/<code>
  • 普通方法
  1. 與定義函數無區別。
  2. 可以被類實例調用,不能被類調用。

實例方法、類方法與靜態方法的區別(在類中有類變量、實例變量沒有靜態變量)

<code>class Demo():
outerVar = '這是類變量'
def __init__(self):
\t\t\t\tself.innerVar = '這是實例變量'

def innerMethod(self):         #實例化方法只能被實例化對象使用,參數必須有self
\t\t\t\tprint('這是實例方法')

@classmethod
def classMethod(cls):        #可以被類和對象調用,從屬於類,不建議使用的對象操作
\t\t\t\tprint('這是類方法')     #第一個參數必須是cls

@staticmethod
def staticMethod():             #靜態方法可以被類和對象調用,本質是在改存儲空間開闢一塊空
\t\t\t\tprint('這是靜態方法')    #間寫出的函數,在定義靜態方法時,沒有強制要求使用cls或者self/<code>


  • 查看類的功能

使用dir() 和 help() 函數

  • 重點使用的內置的屬性或者方法

__new__ 用於創建出對象,被自動創建

__init__ 用於初始化對象,被自動調用,可以理解為對對象的加工

__str__ 用於顯示對象的描述信息(有返回值),一般建議重寫這個方法

__del__ 用於將對象從內存中清除,被自動調用


分享到:


相關文章: