類是抽象的模版,物件是類的例項。
python的self
相當於c++的this
指標`。表示建立的例項本身。
在類中定義的函式只有一點不同,就是第乙個引數永遠是例項變數self,並且,呼叫時,不用傳遞該引數。
class test:
def prt(self):
print(self)
print(self.__class__)
t = test()
t.prt()
# <__main__.test object at 0x000000bc5a351208>
#
在python中以兩個下劃線開頭的方法,__init__
、__str__
、__doc__
、__new__
等,被稱為"魔術方法"(magic methods)。該方法在類例項化的時候會自動呼叫。
python中的魔法方法可以理解為:對類中的內建方法的過載,注意這裡不是重寫。
過載和重寫的區別:
方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。過載發生在乙個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的引數列表,有相容的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(黎克特制代換原則)。過載對返回型別沒有特殊的要求,不能根據返回型別進行區分。e.g.
class ball:
def __init__(self, name):
self.name = name
def kick(self):
print("我叫%s,該死的,誰踢我..." % self.name)
a = ball("球a")
b = ball("球b")
c = ball("球c")
a.kick()
# 我叫球a,該死的,誰踢我...
b.kick()
# 我叫球b,該死的,誰踢我...
在 python 中定義私有變數只需要在變數名或函式名前加上「__」兩個下劃線,那麼這個函式或變數就會為私有的了,比如__example
,類似c++的private。
python中,派生類的定義如下:
class derivedclassname(baseclassname): # baseclassname基類名,必須與派生類定義在乙個作用域內。..
.
除了類,還可以用表示式,基類定義在另乙個模組中時這一點非常有用:
class derivedclassname(modname.baseclassname):..
.
子類除了可以繼承父類的方法,還可以覆蓋父類的方法:
class animal():
def sound():
print("sound")
class dog():
def sound():
print("汪")
class cat():
def sound():
print("喵")
dog = dog()
cat = cat()
dog.sound()
cat.sound()
# 輸出
# 汪# 喵
python 嚴格要求方法需要有例項才能被呼叫,這種限制其實就是 python 所謂的繫結概念。
python 物件的資料屬性通常儲存在名為.__ dict__
的字典中,我們可以直接訪問__dict__
,或利用 python 的內建函式vars()獲取.__ dict__
。
魔法方法的第乙個引數應為cls(類方法) 或者self(例項方法)。
cls:代表乙個類的名稱
self:代表乙個例項物件的名稱
參考:魔法方法
Task07 類與物件與魔法方法
classc num 0 類屬性 def init self self.x 4 例項屬性 self.y 5 例項屬性 c.count 6 例項屬性def 方法名 classc defmyfun print hello c c c.myfun 建立例項物件的時候不應該包含在類中 類中的每個方法都必須至...
Task10 類與物件
象 屬性 方法 物件是類的例項。換句話說,類主要定義物件的結構,然後我們以類為模板建立物件。類不但包含方法定義,而且還包含所有例項共享的資料。封裝 資訊隱蔽技術 我們可以使用關鍵字 class 定義 python 類,關鍵字後面緊跟類的名稱 分號和類的實現。class turtle python中的...
Task 10類與物件
物件 屬性 方法 物件是類的例項。換句話說,類主要定義物件的結構,然後我們以類為模板建立物件。類不但包含方法定義,而且還包含所有例項共享的資料。封裝 資訊隱蔽技術 我們可以使用關鍵字 class 定義 python 類,關鍵字後面緊跟類的名稱 分號和類的實現。class turtle python中...