Python筆記_第三篇_面向對象_2.構造函數和析構函數(含self說明)

1. 構造函數java

  爲何要有構造函數函數

  打一個比方:類的建立就是比如你建立了好了一種格式的房間,你租給上一個住戶的後,裏面會對方不少「垃圾」和不規則的物品擺放。構造函數就是下一個住戶再使用的時候進行物品的初始化擺放,防止下一個用戶再使用的時候會出現沒有初始化物品錯放的錯誤等。this

  構造函數的格式:spa

  __init__( ):.net

  注意:在使用建立對象的時候會自動調用,構造函數用於初始化類實例的狀態。若是不顯式的建立構造函數,默認會自動添加一個構造函數。其實因爲沒有自己都會帶上這個構造函。可是仍是要寫上比較好。code

  舉例說明:對象

class Person(object):
    def __init__(self,name,age,height,weight):
        print(name,age,height,weight)
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
    def run(self):
        print("run")
    def eat(self,food):
        print("eat " + food)

per3 = Person("hanmeimei",20,170,55)
print(per3.name,per3.age,per3.height,per3.weight)
# hanmeimei 20 170 55
# hanmeimei 20 170 55

per4 = Person("lilei",18,180,80)
print(per4.name,per4.age,per4.height,per4.weight)
# lilei 18 180 80
# lilei 18 180 80

 

2. 析構函數blog

  爲何要有析構函數內存

    以前咱們在第一篇關於內存詳細解析的時候說過,在高級的語言相似於C/C++、java等不須要手動的去釋放內存。在這類語言當中有自動的內存管理機制。其實析構函數就是釋放類在調用後的一種內存釋放做用。所以咱們釋放內存經常使用的一共有四種,釋放類的內存,釋放實例化的內存,釋放函數內存,釋放變量內存。析構函數就是釋放類的內存的一種方式,可是咱們有自動化的內存釋放機制,這種方式通常咱們也不太寫。it

  格式:

  __del__( )

  舉例說明:

# 第一種釋放
class Person(object):
    def __init__(self,name,age,height,weight):
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
    def __del__(self):
        print("這裏是析構函數")
    def run(self):
        print("run")
    def eat(self,food):
        print("eat " + food)
    def say(self):
        print("Hello! My name is %s, I am %d years old" %(self.name,self.age))

per5 = Person("hanmeimei",20,170,55)
# 第二種釋放
del per5 # 對象釋放後就不能在訪問了

# 第三種釋放:在函數裏定義的對象,會在函數結束時自動釋放,這樣能夠用來減小內存空間的浪費。
def func():
    perx = Person("aa",1,1,1)

func()

 

3. self說明

  咱們發現,在類的列表中有一個object的父類。在屬性和方法的編寫的時候出現了self的這個東西。這個東西就是一種「自身限制」的做用。解釋以下:  

  self:表示類的實例,而非類。那個對象調用方法,那麼該方法中的self表明那個對象。

  self.__class__:表明類名。

  self.表示調用自身類。表示當前實例的引用。意思是:他只能被用在下列類成員的代碼塊中

  self的目的:

    用於區分類的成員和本地的變量或參數。

    做爲調用方法的實參。

  self相似於C# 語言中的this.的意思

  舉例說明:

class Person(object):
    def __init__(self,name,age,height,weight):  
       # print(name,age,height,weight)
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight

    def run(self):
        print("run")
    def eat(self,food):
        print("eat " + food)
    def say(self):
        print("Hello! My name is %s, I am %d years old" %(self.name,self.age))
        # self不是關鍵字,換成其餘的標識符也是能夠的,可是帥的人通常都用self

per = Person("Tom",20,160,80)
per.say()

 

4.cls說明

  Self表示一個具體的實例自己。若是用了staticmethod(靜態方法),那麼飢渴五十這個self,把這個方法當成一個普通使用。

  cls表示這個類自己,經常使用用在返回這個類的方法或者屬性的類型和信息信息。

>>> class A(object):
        def foo1(self):
            print "Hello",self
        @staticmethod
        def foo2():
            print "hello"
        @classmethod
        def foo3(cls):
            print "hello",cls


>>> a = A()

>>> a.foo1()          #最多見的調用方式,但與下面的方式相同
Hello <__main__.A object at 0x9f6abec>

>>> A.foo1(a)         #這裏傳入實例a,至關於普通方法的self
Hello <__main__.A object at 0x9f6abec>

>>> A.foo2()          #這裏,因爲靜態方法沒有參數,故能夠不傳東西
hello

>>> A.foo3()          #這裏,因爲是類方法,所以,它的第一個參數爲類自己。
hello <class '__main__.A'>

>>> A                 #能夠看到,直接輸入A,與上面那種調用返回一樣的信息。
<class '__main__.A'>
--------------------- 
做者:daijiguo 
來源:CSDN 
原文:https://blog.csdn.net/daijiguo/article/details/78499422 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!
相關文章
相關標籤/搜索