1. 程式人生 > >面向物件的基本概念

面向物件的基本概念

self的意義:

哪一個物件呼叫的方法,self就是哪一個物件的引用的

在類封裝的方法內部,self就表示當前呼叫方法的物件自己

呼叫方法時,程式設計師不需要傳遞self引數(但是定義的時候,第一個引數必須是self)

在方法內部:可以通過self.訪問物件的屬性

在方法外部:可以通過self.呼叫其他的物件方法

新式類和舊式(經典)類:

object是Python為所有物件提供的基類,提供有一些內建的屬性和方法,可以使用dir函式檢視

新式類:以object為基類的類,推薦使用

經典類:不以object為基類的類,不推薦使用

在python3.X中定義的類時,如果沒有指定父類,會預設使用object作為基類--python3.x中定義的類都是新式類

在python2.x中定義類時,如果沒有指定父類,則不會以object作為基類

#########推薦使用新式類(object類)############

新式類和舊式類在多繼承時---會影響到方法的搜尋順序

今後在定義類時,如果沒有父類,建議統一繼承自object

用object類的目的:

        為保證編寫的程式碼能夠同時在python2.x和python3.x執行

類的私有屬性和私有方法 :

私有屬性和私有方法

應用場景及定義方式

應用場景

在實際開發中,物件的某些屬性或方法可能只希望在物件的內部使用,而不希望在外部被訪問到

私有屬性就是物件不希望公開的屬性

私有方法就是方法不希望公開的方法

定義屬性或方法:

在屬性名或者方法名前增加兩個下劃線,定義的就是私有屬性或方法

性質:

1.子類物件不能在自己的方法內部,直接訪問父類的私有屬性和私有方法

2.子類物件可以通過父類的公有方法間接訪問到私有屬性或私有方法

私有屬性,外界不能直接訪問

私有方法,外界不能直接呼叫

因此,私有屬性,私有方法常用做一些內部的事情

例1:

        在子類的物件方法中,不能訪問父類的私有屬性

class A:     def __init__(self):         # 在初始化方法中定義兩個屬性,一個公有屬性一個私有屬性         self.num1 = 100         self.__num2 = 200

    def __test(self):         print '私有方法 %d %d' % (self.num1, self.__num2)

    def test(self):         print '父類的公有方法 %d' % self.__num2         self.__test()

class B(A):     def demo(self):         # 在子類的物件方法中,不能訪問父類的私有屬性         print '訪問父親的私有屬性 %d' % self.__num2

# 建立一個子類物件 b = B() b.demo()

例2:

        在子類物件的方法中,不能呼叫父類的私有方法

class A:
    def __init__(self):
        # 在初始化方法中定義兩個屬性,一個公有屬性一個私有屬性
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print '私有方法 %d %d' % (self.num1, self.__num2)

    def test(self):
        print '父類的公有方法 %d' % self.__num2
        self.__test()


class B(A):
    def demo(self):
        # 在子類物件的方法中,不能呼叫父類的私有方法
         self.__test()

# 建立一個子類物件
b = B()
b.demo()

例3:

呼叫父類的公有方法間接訪問到父類的私有屬性或者私有方法

class A:
    def __init__(self):
        # 在初始化方法中定義兩個屬性,一個公有屬性一個私有屬性
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print '私有方法 %d %d' % (self.num1, self.__num2)

    def test(self):
        print '父類的公有方法 %d' % self.__num2
        self.__test()


class B(A):
    def demo(self):
        # 呼叫父類的公有方法
        self.test()

# 建立一個子類物件
b = B()
b.demo()

初始化方法:

當使用類名()建立物件時,python的直譯器會自動執行以下操作:

1.為物件在記憶體中分配空間--建立物件

2.呼叫初始化方法為物件的屬性設定初始值--初始化方法(__init__)

這個初始化方法就是__init__方法,__init__是物件的內建方法

__init__方法是專門用來定義一個類具有哪些屬性的方法

class Cat:
    def __init__(self,new_name): # 與函式一樣
        print '這是一個初始化方法'
        # self.屬性名= 屬性的初始值
        self.name = new_name
    # 在類中,任何方法都可以使用這個self.name
    def eat(self):
        print '%s 愛吃魚' %self.name
# 並沒有呼叫__init__方法
# 使用類名()建立物件的時候,會自動呼叫初始化方法__init__
tom = Cat('Tom')
# 在__init__方法的內部使用 self.屬性名= 屬性的初始值 定義物件的屬性
# 定義屬性之後,再使用Cat類建立物件,都會擁有該屬性
print tom.name
tom.eat()

lazy_cat=Cat('Lazy_cat')
lazy_cat.eat()

內建方法:

__del__方法:物件被從記憶體中銷燬前,會自動呼叫

__str__方法:返回物件的描述資訊 print 物件

__del__方法:

在python中

        當一個物件被從記憶體中銷燬前(把這個物件從記憶體中刪除掉),會自動呼叫__del__方法

如果希望在物件被銷燬前,再做一些事情,可以考慮一下__del__方法

__str__方法:

      在python中

     使用python輸出物件變數,預設情況下,會輸出這個變數引用的物件是由哪一個類建立的物件,以及在記憶體中的地址(十六進位制表示)

如果在開發中,希望使用print輸出物件變數時,能夠列印自定義的內容,就可以利用__str__這個內建方法了

class Cat:     def __init__(self,new_name):         self.name = new_name         print '%s 來了' %self.name     def __del__(self):         print '%s 走了' %self.name     def __str__(self):         # 必須return 返回一個字串         return '我是 %s' %self.name

# tom是一個全域性變數 # 所以當我們的程式碼全部執行完之後,系統才會把tom這個物件進行回收 tom = Cat('Tom') print tom print tom.name # del關鍵字,可以從記憶體中刪除一個物件,del關鍵字自己呼叫了__del__方法,但是慎用 # del tom # print '*' * 50

總結: 生命週期 一個物件從呼叫類名()建立,宣告週期開始 一個物件的__del__方法一旦被呼叫,生命週期就結束 在物件的生命週期內,可以訪問物件的屬性,呼叫物件的方法