什么是對象和類
https://www.cnblogs.com/poloyy/p/15178423.html
Python 類
類定義語法
最簡單的類定義看起來像這樣
class ClassName: <statement-1> . . . <statement-N>
類定義與函數定義 (def 語句) 一樣必須被調用執行才會起作用
類命名空間
- 當定義類時,會創建一個新的命名空間,也是一個局部作用域
- 上面的類定義栗子里,statement-1 到 statement-N 就是這個類的命名空間
類的取名建議規則
類名中的所有單詞首字母要大寫,采用駝峰命名法(例 GameCase )的書寫方式
最簡單的一個類
class Dog: pass
- 這個類沒有屬性也沒有方法
- 實際應用中,很少會創建空類,因為空類沒有任何實際意義
包含屬性、方法的一個類
class Person: def introduce(self): print('My name is %s, I am %d years old' % (self.name, self.age))
Person 類,有一個方法 introduce,有兩個屬性 name、age
通過 Person 類創建兩個實例對象
# 對象一 tom = Person() # 對象屬性 tom.name = 'tom' tom.age = 10 # 對象二 jerry = Person() # 對象屬性 jerry.name = 'jerry' jerry.age = 20 # 調用對象的方法 tom.introduce() jerry.introduce() # 輸出結果 My name is tom, I am 10 years old My name is jerry, I am 20 years old
類對象
什么是類對象
- 聲明了一個類,它就是一個類對象
- 程序運行時,在內存中就會創建一個類對象,有且只有一個
- 類對象也有自己的屬性和方法,分別叫做:類屬性、類方法(后面詳解)
打印下類對象看看
# 類對象 class person: pass print(person) print(id(person)) # 輸出結果 <class '__main__.person'> 140485598521200
打印的就是一個類對象和內存地址
類對象支持兩種操作
- 屬性引用
- 實例化
屬性引用
- 使用 Python 所有屬性引用的標准語法: Obj.name
- 有效的屬性名稱是類對象被創建時存在於類命名空間中的所有名稱
class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world'
有效的屬性引用
- MyClass.i:返回一個整數
- MyClass.f:返回一個函數對象
- MyClass.__doc__:返回當前類的文檔字符串
print(MyClass.i) print(MyClass.f) print(MyClass.__doc__) # 輸出結果 12345 <function MyClass.f at 0x10f43f310> A simple example class
實例化
實例化其實就是調用類對象,從而創建一個實例對象
c = MyClass()
創建類的新實例並將此對象分配給局部變量 c
實例對象
什么是實例對象
- 通過類實例化操作的對象就是實例對象
- 一個類可以多次實例化,生成多個實例對象
# 實例對象 class person: pass # 實例化:類名() p1 = person() p2 = person() p3 = person() print(p1, id(p1)) print(p2, id(p2)) print(p3, id(p3)) # 輸出結果 <__main__.person object at 0x10e42b8b0> 4534220976 <__main__.person object at 0x10e42b880> 4534220928 <__main__.person object at 0x10e42b850> 4534220880
三個 person 類實例對象,分別有自己獨立的內存地址
常說的面向對象編程是什么
- 設計類
- 創建類實例對象
- 實例對象調用方法
創建實例對象詳解
- 在內存中為對象分配空間
- 調用初始化方法 __init__ 為對象初始化
- 對象創建后,內存中就有一個類的實例對象了
由此可見,一個類可以有很多個對象,每個對象都有屬於自己的變量、方法;
- 創建出來的 對象 叫做 類的 實例對象
- 創建對象的 行為 叫做 實例化
- 對象的屬性 叫做 實例屬性
- 對象調用的方法 叫做 實例方法
__init__、實例屬性、實例方法后續詳解
知識點
- 每個對象都有自己獨立的內存空間,保存自己的屬性
- 但是實例方法在內存中都只有一個,實例方法中的 self 就是實例對象的引用,當對象調用實例方法時,會默認把實例對象傳給方法內部
如果不懂的話,看看下面代碼的輸出就知道啦; id() 是用於獲取對象的內存地址
class person(): def __init__(self, name): self.name = name print(f"init-{self.name} ", id(self)) def test(self): print(f"test-{self.name} ", id(self)) p1 = person("p1") print("p1-", id(p1)) print("p1 fun-", id(p1.test())) print("") p2 = person("p2") print("p2-", id(p2)) print("p2 fun-", id(p2.test())) print("調用方法對比:",id(p1.test()) == id(p2.test()))
執行結果
init-p1 1921848172840 p1- 1921848172840 test-p1 1921848172840 p1 fun- 140719454498016 init-p2 1921848175136 p2- 1921848175136 test-p2 1921848175136 p2 fun- 140719454498016 test-p1 1921848172840 test-p2 1921848175136 調用方法對比: True
實例變量和類變量
實例屬性=實例變量
類屬性=類變量
class Person(): name = "cool guy" if __name__ == "__main__": p = Person() print(p.name) # 打印name屬性,因為實例並沒有name屬性,所以會繼續查找class的name屬性 print(Person.name) # 打印類的name屬性 p.name = "bad guy" # 給實例綁定name屬性 p.age = 12 # 給實例綁定age屬性 print(p.age) # 實例找到age直接打印 print(p.name) # 由於實例屬性優先級比類屬性高,因此,它會屏蔽掉類的name屬性 print(Person.name) # 仍然打印類的name屬性
執行結果
cool guy
cool guy
12
bad guy
cool guy
注意點
- 在寫代碼時,要避免類屬性和實例屬性重名,否則實例變量會屏蔽掉類屬性
- 給實例綁定新的實例屬性時,會直接覆蓋掉重名的類屬性
類方法會在下一篇幅介紹哦!