面向對象技術簡介
- 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
- 方法:類中定義的函數。
- 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用。
- 數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
- 局部變量:定義在方法中的變量,只作用於當前實例的類。
- 實例變量:在類的聲明中,屬性是用變量來表示的,這種變量就稱爲實例變量,實例變量就是一個用 self 修飾的變量。
- 繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作爲一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
- 實例化:創建一個類的實例,類的具體對象。
- 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
self代表類的實例,而非類
類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
以上實例執行結果爲:
<__main__.Test instance at 0x100771878>
__main__.Test
從執行結果可以很明顯的看出,self 代表的是類的實例,代表當前對象的地址,而 self.class 則指向類。
self 不是 python 關鍵字,我們把他換成 runoob 也是可以正常執行的:
class Test:
def prt(runoob):
print(runoob)
print(runoob.__class__)
t = Test()
t.prt()
以上實例執行結果爲:
<__main__.Test instance at 0x100771878>
__main__.Test
class MyClass:
"""一個簡單的類實例"""
i = 12345
def f(self):
return 'hello world'
# 實例化類
x = MyClass()
# 訪問類的屬性和方法
print("MyClass 類的屬性 i 爲:", x.i)
print("MyClass 類的方法 f 輸出爲:", x.f())
問題1:類屬性被重新賦值,是否影響類屬性的引用?
class testA:
attr = 1
obj_a = testA()
testA.attr = 42
print(obj_a.attr)
#輸出結果
42
問題2:實例屬性被重新賦值,是否影響類屬性的引用?
class testA:
attr = 1
obj_a = testA()
obj_b = testA()
obj_a.attr = 42
print(obj_b.attr)
#輸出結果
1
問題3:實例屬性和類屬性具有相同名稱,那麼“.”後邊引用的是什麼?
class testA:
attr = 1
def __init__(self):
self.attr = 42
obj_a = testA()
print(obj_a.attr)
#輸出結果
42