什麼是物件和類

https://www.cnblogs.com/poloyy/p/15178423.html

Python 類

類定義語法

最簡單的類定義看起來像這樣

  1. class ClassName:
  2. <statement-1>
  3. .
  4. .
  5. .
  6. <statement-N>

類定義與函式定義 (def 語句) 一樣必須被呼叫執行才會起作用

類名稱空間

  • 當定義類時,會建立一個新的名稱空間,也是一個區域性作用域
  • 上面的類定義栗子裡,statement-1 到 statement-N 就是這個類的名稱空間

類的取名建議規則

類名中的所有單詞首字母要大寫,採用駝峰命名法(例 GameCase )的書寫方式

最簡單的一個類

  1. class Dog:
  2. pass
  • 這個類沒有屬性也沒有方法
  • 實際應用中,很少會建立空類,因為空類沒有任何實際意義

包含屬性、方法的一個類

  1. class Person:
  2. def introduce(self):
  3. print('My name is %s, I am %d years old' % (self.name, self.age))

Person 類,有一個方法 introduce,有兩個屬性 name、age

通過 Person 類建立兩個例項物件

  1. # 物件一
  2. tom = Person()
  3.  
  4. # 物件屬性
  5. tom.name = 'tom'
  6. tom.age = 10
  7.  
  8. # 物件二
  9. jerry = Person()
  10.  
  11. # 物件屬性
  12. jerry.name = 'jerry'
  13. jerry.age = 20
  14.  
  15. # 呼叫物件的方法
  16. tom.introduce()
  17. jerry.introduce()
  18.  
  19. # 輸出結果
  20. My name is tom, I am 10 years old
  21. My name is jerry, I am 20 years old

類物件

什麼是類物件

  • 聲明瞭一個類,它就是一個類物件
  • 程式執行時,在記憶體中就會建立一個類物件,有且只有一個
  • 類物件也有自己的屬性和方法,分別叫做:類屬性、類方法(後面詳解)

列印下類物件看看

  1. # 類物件
  2. class person:
  3. pass
  4.  
  5. print(person)
  6. print(id(person))
  7.  
  8. # 輸出結果
  9. <class '__main__.person'>
  10. 140485598521200

列印的就是一個類物件和記憶體地址

類物件支援兩種操作

  1. 屬性引用
  2. 例項化

屬性引用

  • 使用 Python 所有屬性引用的標準語法: Obj.name
  • 有效的屬性名稱是類物件被建立時存在於類名稱空間中的所有名稱
  1. class MyClass:
  2. """A simple example class"""
  3. i = 12345
  4.  
  5. def f(self):
  6. return 'hello world'

有效的屬性引用

  • MyClass.i:返回一個整數
  • MyClass.f:返回一個函式物件
  • MyClass.__doc__:返回當前類的文件字串
  1. print(MyClass.i)
  2. print(MyClass.f)
  3. print(MyClass.__doc__)
  4.  
  5. # 輸出結果
  6. 12345
  7. <function MyClass.f at 0x10f43f310>
  8. A simple example class

例項化

例項化其實就是呼叫類物件,從而建立一個例項物件

  1. c = MyClass()

建立類的新例項並將此物件分配給區域性變數 c

例項物件

什麼是例項物件

  • 通過類例項化操作生成物件就是例項物件
  • 一個類可以多次例項化,生成多個例項物件
  1. # 例項物件
  2. class person:
  3. pass
  4.  
  5. # 例項化:類名()
  6. p1 = person()
  7. p2 = person()
  8. p3 = person()
  9. print(p1, id(p1))
  10. print(p2, id(p2))
  11. print(p3, id(p3))
  12.  
  13. # 輸出結果
  14. <__main__.person object at 0x10e42b8b0> 4534220976
  15. <__main__.person object at 0x10e42b880> 4534220928
  16. <__main__.person object at 0x10e42b850> 4534220880

三個 person 類例項物件,分別有自己獨立的記憶體地址

常說的面向物件程式設計是什麼

  1. 設計類
  2. 建立類例項物件
  3. 例項物件呼叫方法

建立例項物件詳解

  1. 在記憶體中為物件分配空間
  2. 呼叫初始化方法  __init__  為物件初始化
  3. 物件建立後,記憶體中就有一個類的例項物件了

由此可見,一個類可以有很多個物件,每個物件都有屬於自己的屬性、方法;

  • 創建出來的 物件 叫做 類的 例項物件
  • 建立物件的 行為 叫做 例項化
  • 物件的屬性 叫做 例項屬性
  • 物件呼叫的方法 叫做 例項方法

__init__、例項屬性、例項方法後續詳解

知識點

  • 每個物件都有自己獨立的記憶體空間,儲存自己的屬性
  • 但是例項方法在記憶體中都只有一個,例項方法中的 self 就是例項物件的引用,當物件呼叫例項方法時,會預設把例項物件傳給方法內部

如果不懂的話,看看下面程式碼的輸出就知道啦; id() 是用於獲取物件的記憶體地址

  1. class person():
  2. def __init__(self, name):
  3. self.name = name
  4. print(f"init-{self.name} ", id(self))
  5.  
  6. def test(self):
  7. print(f"test-{self.name} ", id(self))
  8.  
  9. p1 = person("p1")
  10. print("p1-", id(p1))
  11. print("p1 fun-", id(p1.test))
  12.  
  13. p2 = person("p2")
  14. print("p2-", id(p2))
  15. print("p2 fun-", id(p2.test))
  16.  
  17. # 輸出結果
  18. init-p1 4435237568
  19. p1- 4435237568
  20. p1 fun- 4435260032
  21.  
  22. init-p2 4435237472
  23. p2- 4435237472
  24. p2 fun- 4435260032 

可以看到,兩個例項物件呼叫的例項方法是同一個記憶體地址