面向物件的基本概念
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__方法一旦被呼叫,生命週期就結束 在物件的生命週期內,可以訪問物件的屬性,呼叫物件的方法