python學習筆記(六)——類的初始化(__init__)、類屬性和類方法 和 對象

學習本篇文章後會瞭解到:類的創建,爲對象添加屬性,對象的初始化,自定義對象的輸出,類屬性和類方法的創建。

1. 類的定義與格式

  • 類是對一羣具有相同特徵或者行爲的事物的一個統稱。

  • 類是一個模塊,是負責創建對象的。

  • 類的命名採用大駝峯命名法。

  • 類中的特徵稱爲屬性,行爲稱爲方法
    格式:

      class 類名:
      		def 方法1(self,參數列表):
      			pass
      		def 方法2(self,參數列表):
    

注意:在類中定義的方法中的第一個參數是self。當然也可以採用其他的名稱只是習慣性的使用self。
要設計一個類,通常需要滿足一下三個要素:

  1. 類名 這類事情的名字,滿足大駝峯命名法。
  2. 屬性 表示類具有什麼樣的特徵。
  3. 方法 表示類具有什麼樣的行爲。

1.1 創建類及self的含義

在類中創建一個函數時,系統自動在函數中添加self參數。哪一個對象調用的方法,self就是哪一個對象的引用;在調用方法時,不需要傳遞self參數。在方法內部調用對象的屬性可以使用 self. 的方式,也可以通過 self. 調用其他的對象方法。

class Person:
    def run(self):
        print("跑步功能")
    def eat(self):
        print("吃飯")

# 創建兩個Person對象,並分別調用類中的兩個方法
tom = Person() 
tom.eat()
tom.run()
print()
danni = Person()
danni.run()
danni.eat()
print(danni)  #  打印出引用的地址
	
運行結果如下:
吃飯
跑步功能

跑步功能
吃飯
<__main__.Person object at 0x0000000002588C88>

補充:
在計算機中通常使用十六進制表示內存地址。
%d:可以以10進制輸出數字
%x :可以以16進制輸出數字

2. 對象

是由類創建出來的一個具體存在,可以直接使用如下的格式

	對象變量名 = 類名()

其實在面向對象過程中:變量,數據,函數都是對象

類和對象的關係
  • 類只有一個,而對象可以有很多個(類可以創建多個對象)。
  • 不同的對象之間屬性可能會各不相同。
  • 類中定義什麼屬性和方法,對象中就有什麼屬性和方法,不可能多,也不能少

2.1. 給對象增加屬性

方法一:
使用在類外界使用對象名 .屬性名 ,利用賦值語句進行增加。

class Person:
    def run(self):
        print("%s跑步功能" % self.name )   # 格式化輸出,在方法內部調用對象的屬性,**self.**屬性名
    def eat(self):
        print("吃飯")
	
tom = Person()  # 創建一個Person對象
tom.name = "Tom"  # 給對象添加一個屬性 name
tom.run()
tom.eat()
print()

運行結果:
Tom跑步功能
吃飯

方法二:
下面講到__init__()函數的時候會講到

注意:

  • 在類的外部,通過變量名. 訪問對象的屬性和方法
  • 在類封裝的方法中,通過self. 訪問對象的屬性和方法。

3. 初始化方法

當使用類名()創建對象時,會自動執行一下操作:

  1. 爲對象在內存中分配空間—創建對象(__new__)
  2. 爲對象的屬性設置初始值—初始化方法(__init__

注意:以兩個下劃線開頭以兩個下劃線結尾的函數爲Python中的內置函數。可以直接被調用

3.1 __init__

__init__()方法是專門用來定義一個類具有哪些屬性的方法,就是無論系統是否調用,都會被執行。
示例代碼:

演示一:
class Cat:
    def __init__(self):
        print("這是初始化方法")	 # 系統會直接調用
cat = Cat()
演示結果:
這是初始化方法

演示二:添加屬性並賦值
class Cat:
    def __init__(self):
        print("這是初始化方法")
        # self.屬性名 = 屬性的初始值
        self.name = "Tom"
    def eat(self):
        print("%s愛吃魚" % self.name)
	
cat = Cat()
cat.eat()

結果:
這是初始化方法
Tom愛吃魚

初始化的同時設置初始值:

  1. 把希望設置的屬性值,定義成__init__方法的參數
  2. 在方法內部使用self.屬性 = 形參 接收外部傳遞的參數。
  3. 在創建對象時,使用類名(屬性1,屬性2)調用

示例代碼:

class Cat:
    def __init__(self,new_name):
        print("這是初始化方法")
        # self.屬性名 = 屬性的初始值
        self.name = new_name
    def eat(self):
        print("%s愛吃魚" % self.name)

cat = Cat("Tom")
cat.eat()

結果:
這是初始化方法
Tom愛吃魚

3.2 __del__()

__del__()方法,對象被從內存中銷燬前,會被自動調用
示例代碼:

class Cat:
   def __init__(self,new_name):
        print("這是初始化方法")
        # self.屬性名 = 屬性的初始值
        self.name = new_name
    def eat(self):
        print("%s愛吃魚" % self.name)
    def __del__(self):
        print("%s走了"%self.name)  # 系統會自動調用
cat = Cat("Tom")
cat.eat()

結果爲:
這是初始化方法
Tom愛吃魚
Tom走了

3.3 __str__()

__str__方法,返回對象的描述信息,在方法內部必須返回一個字符串,使用return關鍵字,使用**print(對象名)**輸出,自定義的內容,即return後面的字符串。
希望在程序中輸出對象定義的內容,而不是輸出內存地址。
示例代碼:

class Cat:
    def __init__(self,new_name):
        print("這是初始化方法")
        # self.屬性名 = 屬性的初始值
        self.name = new_name
    def eat(self):
        print("%s愛吃魚" % self.name)
    def __del__(self):
        print("%s走了"%self.name)
    def __str__(self):
        return "我是Cat%s"%self.name
cat = Cat("Tom")
print(cat)
print("*"*30)

結果爲:	
這是初始化方法
我是CatTom
******************************
Tom走了

代碼解釋:
如果不加入__str__(self):

def __str__(self):
   	return "我是Cat%s"%self.name

當調用print(cat)時會輸出:

<__main__.Cat object at 0x0000000001F18D30>

4. 實例

  1. 類創建出來的對象叫做類的實例
  2. 創建對象的動作叫做實例化
  3. 對象的屬性叫做實例屬性
  4. 對象調用的方法叫做實例化方法

在程序執行時:
1.對象各自擁有自己的實例屬性
2.調用對象方法,可以通過self.

每一個對象都有自己獨立的內存空間,保存各自不同的屬性。多個對象的方法,在內存中只有一份,在調用方法時,需要把對象的引用傳遞到方法的內部。


以上所描述的都屬於對象中的內容
Python屬於面向對象的語言,一切皆對象

5. 類是一個特殊的對象

在類中包括也包括屬性和方法,稱:

  • 類屬性
    • 類屬性就是給類對象定義的屬性,通常用來記錄與這個類相關的特徵,類屬性不會用於記錄具體對象的特徵。
  • 類方法
    • 類方法就是針對類對象定義的方法

5.1 類屬性

示例一:添加一個類屬性,在實例化方法中調用類屬性: 類名.類屬性
class Tool(object):
    count = 0
    def __init__(self,name):
        self.name = name
        #讓類的屬性加 1
        Tool.count += 1
# 1.創建工具對象
tool = Tool("斧頭")
tool1 = Tool("榔頭")
print("工具的總數:%d"% tool1.count)
print(Tool.count)

結果:
工具的總數:2
2
調用類屬性的方法
  • 類名.類屬性

  • 對象名.類屬性(不推薦使用),因爲在Python中存在一個向上查找的機制,如果對象中沒有count屬性,則向上查找類屬性。
    注意:
    如果使用對象.類屬性 = 值 賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值。

      class Tool(object):
          count = 0
          def __init__(self,name):
              self.name = name
              #讓類的屬性加 1
              Tool.count += 1
      # 1.創建工具對象
      tool = Tool("斧頭")
      tool1 = Tool("榔頭")
      tool1.count = 100
      print("工具對象的總數:%d"% tool1.count)
      print("類屬性%d"% Tool.count)
      結果:
      工具對象的總數:100
      類屬性2
    

5.2 類方法

語法:

@classmethod
def 類方法名(cls):
	pass

描述:類方法需要用修飾器@classmethod來標識,告訴解釋器這是一個類方法。
類方法的第一個參數應該是 cls

  1. 由哪一個類調用的方法,方法內的cls就是哪一個類的引用。

  2. 和實例方法中的第一個參數self類似。

  3. 使用其他名稱也可以,不過習慣使用cls

  4. 通過類名.調用類方法,不需要傳遞cls參數。

  5. 在方法內部通過cls.訪問類的屬性。也可以通過cls.調用其他的類的方法

     class Tool(object):
     	# 使用賦值語句定義類屬性,記錄所有工具對象的數量
     	count = 0
     	# 定義一個類方法
         @classmethod
         def show_count(cls):
             print("工具對象的數量%d" % cls.count)
     
         def __init__(self,name):
             self.name = name
             Tool.count += 1
    
     # 創建工具對象
     tool1 = Tool("斧頭")
     tool2 = Tool("榔頭")
     # 調用類方法
     Tool.show_count()
     結果:
     工具對象的數量2
    

5.2.1 靜態方法

既不需要訪問實例屬性或者調用實例方法,也不需要訪問類屬性或者調用類方法
不需要指定第一個參數。靜態方法直接使用類名調用。
語法:

	@staticmethod
	def 靜態方法名():
		pass

示例一:

class Dog(object):
    @staticmethod
    def run():
        print("小狗正在跑")
#通過類名.來調用靜態方法,不需要創建對象
Dog.run()

結果:
小狗正在跑

示例二:

class Game(object):
    # 定義一個類屬性——歷史最高分
    top_score = 0
    def __init__(self,play_name):
        self.play_name = play_name
        
    @staticmethod
    def show_help():
        print("幫助信息")
        
    @classmethod
    def show_top_score(cls):
        print("歷史記錄%d:" %cls.top_score)

    def start_game(self):
        print("%s開始了"%self.play_name)

# 1.查看遊戲的幫助信息
Game.show_help()
# 2.查看歷史最高分
Game.show_top_score()
# 3.創建遊戲對象
game = Game("小曾")
game.start_game()

結果:
幫助信息
歷史記錄0
小曾開始了

總結:
1.實例方法——方法內部需要訪問實例屬性
- 實例方法內部可以使用類名.訪問類屬性
2.類方法——方法內部只需要訪問類屬性
3.靜態方法——方法內部,不需要訪問實例屬性和類屬性
問題:
如果方法內部即需要訪問實例屬性,又需要訪問類屬性,應該定義成什麼方法?

  • 應該定義成實例方法
  • 類只有一個,在實例方法內部可以使用類名.方法類屬性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章