Python成長之路 面向對象

面相對象

關於面向對象的定義和標準在網上有不少,做爲一個初學者我就不在這獻醜了。python

面向對象編程相對於面相過程編程和函數式編程來講,面相對象編程編程利用類和對象建立各類模型來實現對現實世界的描述,它使得程序的維護和擴展變的更簡單,並大大提升了程序的開發效率,另外它使咱們更好的理解代碼邏輯,使得團隊的開發更容易。對於面向對象來講在python中一切皆爲對象。數據庫

面向過程編程:就是咱們作一件事,咱們先要作什麼在作什麼,咱們的代碼就會一步步的實現咱們要的功能,可是當咱們在重複作這件事的時候這個功能咱們就要再寫一次,這樣就會出錯。好比如今的送餐員,他先要到某個店中拿外賣、再根據外賣上的地址送到指定的地方、到了地方後要打電話給定外賣的人,整一個個的動做咱們使用面向過程編程,那咱們就要先實現取外賣、送到指定地點、打電話、把外賣送到訂餐人手上這一系列的功能。一個送外賣的不可能就送一個外賣,一樣也不可能只送一個地方一我的、因此咱們下次再送不一樣的人的時候又要寫差很少的功能,這樣就會出錯。編程

面相對象編程:咱們能夠定義一個送快外賣的人咱們賦予他取外賣、根據地址送到指定位置、再打電話、在等待等等一些關於送餐員的全部功能,當咱們要送餐的時候咱們就建立出一個這個送外賣人的實例出來,而後讓他去作這些事情。ide

 

面向對象的幾個核心

Class 類

一個類便是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具有的屬性(variables(data))、共同的方法函數式編程

Object 對象

一個對象便是一個類的實例化後實例,一個類必須通過實例化後方可在程序中調用,一個類能夠實例化多個對象,每一個對象亦能夠有不一樣的屬性,就像人類是指全部人,每一個人是指具體的對象,人與人以前有共性,亦有不一樣函數

Encapsulation 封裝

在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含着類的數據和方法學習

Inheritance 繼承

一個類能夠派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承對象

Polymorphism 多態

多態是面向對象的重要特性,簡單點說:「一個接口,多種實現」,指一個基類中派生出了不一樣的子類,且每一個子類在繼承了一樣的方法名的同時又對父類的方法作了不一樣的實現,這就是同一種事物表現出的多種形態。blog

 

面向對象的相關介紹

類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體以外。類變量一般不做爲實例變量使用繼承

數據成員:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體以外。類變量一般不做爲實例變量使用

方法重寫:若是從父類繼承的方法不能知足子類的需求,能夠對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。

實例變量:定義在方法中的變量,只做用於當前實例的類

實例化:建立一個類的實例,類的具體對象

方法:類中定義的函數

 

類的定義和實例化對象

類的定義使用class來定義的,定義類分爲新式類和經典類
新式類的定義方式爲"class ClassName(object):"
經典類的定義方式爲"class ClassName:"
新式類和經典類的區別:
  新式類繼承了object,經典類不須要
  多繼承在python2中新式類的時候是深度優先,而經典類是廣度優先
  在python3中無論新式類仍是經典類都是廣度優先
#python2.x
class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(B,C):
    pass

#多繼承的順序爲 D->B->C->A 深度優先

class A(object):
    pass

class B(A):
    pass

class C(A):
    pass

class D(B,C):
    pass

#多繼承的順序爲:D->B->A->C 廣度優先
#python3中多繼承的順序都是:D->B->A->C 廣度優先

  

類的定義和實例化對象

# class Dog(object):
#     """
#     定義一個狗的類
#     """
#     print('hello dog')
#
#
# d = Dog()  #這個就是實例化類。d就是類Dog的實例化
#

class Dog(object):
    family = 'Canidae'  #這個是類變量在整個實例化對象中是公用的
    def __init__(self,name):#__init__方法是構造函數實例化對象時自動執行
        # self爲實例化的對象自己  即即將被實例化的對象obj
        self.name = name #這個就是實例化變量
        print("The dog's name is %s"%self.name)

d = Dog('小黑')#實例化類的時候自動執行__init__
#運行的結果爲'The dog's name is 小黑'
print(d.name) #調用對象的name屬性

  當實例化變量和類變量名同樣的時候咱們在實例化對象後調用的時候調用的是實例化變量,因此說在有相同的變量名時,實例化變量優先類變量。

class MyCalss(object):
    cn= '中國'
    def __init__(self,cn):
        self.cn = cn


d = MyCalss('日本')
print(d.cc)
#結果是‘日本’

  

類中的方法

在類的內部,使用def關鍵字定義的一個方法,與通常的函數不一樣的是類方法必須包含參數self,且第一個參數就是self,self表明的是類的實例。

class Car(object):
    """
    汽車模型
    """
    def __init__(self,name,car_type):#定義構造函數
        self.name = name
        self.car_type = car_type

    def back(self):#定義類的方法必須帶參數self這個self表明的是類的實例
        print('當前模式爲倒退')
    def advance(self):#定義類的方法
        print('當前模式爲前進')

  在類中除了有構造函數以外還有一個析構函數

它的做用是在實例釋放、銷燬或程序結束的時候會自動執行。一般用於一些收尾工做、如關閉數據庫鏈接。析構函數的定義爲__del__(self) 

類的私有屬性和方法

類的私有屬性和方法就是正常的屬性和方法是以兩個下劃線開頭

私有屬性:__private_attrs申明此爲私有屬性,該屬性不能在類的外部被調用,只能在類的內部被調用,調用的語法爲self.__private_attrs

私有方法:__private_methods(self),該方法只能內部調用不能夠外部調用,調用的方式爲self.__private_methods()

class Car(object):
    """
    汽車模型
    """
    __place = 'China'
    def __init__(self,name,car_type):#定義構造函數
        self.name = name
        self.car_type = car_type

    def back(self):#定義類的方法必須帶參數self這個self表明的是類的實例
        print('當前模式爲倒退')
        print('私有屬性:',self.__place)
        print('私有方法:',end=''),self.__advance()
    def __advance(self):#定義私有方法
        print('當前模式爲前進')

dazhong = Car('大衆','轎車')#實例化類

dazhong.back()#調用類中的方法
#dazhong.__advance() #這個調用會報錯,錯誤提示爲 AttributeError: 'Car' object has no attribute '__advance'
#print(dazhong.place)#這個調用會報錯,錯誤提示爲 AttributeError: 'Car' object has no attribute 'place'

  

封裝

對於面向對象的封裝來講,其實就是使用構造方法將內容封裝到對象中,而後經過對象直接或者self間接獲取被封裝的內容。

 

繼承與多繼承

當類之間基本相同,只有部分功能不一樣的時候使用繼承。

繼承是兩個類或者多個類之間的父子關係,子類繼承全部父類共有實例變量和方法。

class People(object):
    def __init__(self,name,sex,age,language):
        self.name = name
        self.sex = sex
        self.age = age
        self.language = language

    def speak(self):
        print('%s 會說 %s' % (self.name,self.language))

class Students(People):
    def __init__(self,name,sex,age,language,school):
        super(Students,self).__init__(name,sex,age,language)
        #上面的是調用父類的構造函數
        self.school = school

student2 = Students('Tom','M',22,'Chinese','一中')

student2.speak()
#執行的結果Tom 會說 Chinese


#若是想要覆蓋父類的方法那麼就在子類中從新寫這個方法。
class Teachers(People):
    def __init__(self,name,sex,age,language,school):
        super(Students,self).__init__(name,sex,age,language)
        #上面的是調用父類的構造函數
        self.school = school
    def speak(self):
        print('%s 在教 %s'%(self.name,self.language))
        
teacher2 = Students('Tom','M',22,'Chinese','一中')

teacher2.speak()#調用類中的方法
#執行的結果Tom 在教 Chinese

  

多繼承

一個類同時繼承多個類,與多個類具備繼承關係,這個類能夠調用全部父類中的方法和類中變量,若是子類中沒有構造函數就會繼承父類的構造函數,繼承的方式爲廣度優先。

由於Python3中無論新式類仍是經典類都爲廣度優先。而python2新式類則爲深度優先,而經典類則爲廣度優先

# class A(object):
#     def __init__(self):
#         print("A")
#
# class B(A):
#     def __init__(self):
#         print('B')
#
# class C(A):
#     def __init__(self):
#         print('C')
#
# class D(B,C):
#     pass
#
# t = D() #結果爲B因此它繼承的是B的構造函數
#若是子類沒有構造函數他就會繼承父類中的構造函數,
#繼承的父類是按照廣度優先




# class A(object):
#     def __init__(self):
#         print("A")
#
# class B(A):
#     pass
#
# class C(A):
#     def __init__(self):
#         print('C')
#
# class D(B,C):
#     pass
#
# t2 = D() #結果爲C 因此繼承的是C的構造函數





class A:
    def __init__(self):
        print("A")

class B(A):
    pass

class C(A):
    def __init__(self):
        print("A")

class D(B,C):
    pass

t3 = D() #結果爲A 繼承的是A的構造函數

  

多態

多態指的是一類事物有多種形態,也就是一種接口,多種實現。用來實現接口的重用。

python中沒有多態的語法,可是它可以實現多態的功能。

class Animal(object):
    def __init__(self, name):
        self.name = name
        
    @staticmethod  #這個就至關於實現了一個藉口多種實現
    def talk(obj):  # 一個接口,多種形態
        obj.talk()

class Cat(Animal):
    def talk(self):
        print('%s: 喵喵喵!' % self.name)


class Dog(Animal):
    def talk(self):
        print('%s: 汪!汪!汪!' % self.name)

c1 = Cat('xiaobai')
d1 = Dog('xiaohei')

Animal.talk(c1)
Animal.talk(d1)

  

關於基礎的面向對象就介紹到這裏,若是有什麼說錯了或者說的很差歡迎指出來。

相互學習,相互進步。

相關文章
相關標籤/搜索