python類繼承 對self理解 靜態方法

2021-09-27 11:05:43 字數 3127 閱讀 8101

在物件導向的語言,繼承是乙個物件導向程式設計語言的特徵,當我們需要乙個新的類,與已經定義的類差別不大,我們可以直接繼承的方法,定義乙個子類,來提高效率,同時也不需要修改已經定義的類,繼承可以不修改父類的情況下,新增新的功能,子類繼承父類,子類就擁有父類的屬性和方法,當然私有屬性不會繼承。子類也稱為派生類,在不同語言中,繼承又可以分為單繼承和多繼承,比如說,oc和swift是單繼承。

單繼承

class animal(object):

#初始化

def __init__(self,name,color):

self.name = name

self.color = color

def __del__(self):

print('物件銷毀----')

# 子類

class dog(animal):

def printif(self):

print(self.color)

print(self.name)

wangcai=dog('wangcai','white')

wangcai.printif()

上面的animal這個類中,dog這個類並沒有init這個初始化方法,通繼承得到init這個初始化方法;

如果子類可以通過繼承的方式訪問父類的私有屬性,

如果在子類中,自己定義的方法是不能訪問父類的私有屬性的。

class animal(object):

#初始化

def __init__(self,name,color):

self._name = name

self.color = color

def __del__(self):

print('物件銷毀----')

def test1(self):

print(self._name)

# 子類

class dog(animal):

def printif(self):

print(self.color)

print(self.name)

wangcai=dog('wangcai','white')

wangcai.printif()

wangcai.test1()

如果乙個方法前面有兩個下劃線,就是乙個私有的方法。只能在類中重新定義的方法,在這個方法呼叫這個私有方法。

重寫父類的方法

所謂重寫就是在子類中,有乙個和父類相同的方法。子類的方法會覆蓋父類的方法。

class animal(object):

#初始化

def bar(self):

print('啊啊----')

# 子類

class cat(animal):

#在子類中重寫編寫父類的方法就叫重寫

def bar(self):

#呼叫父類方法

animal.bar()

print('喵喵---')

tomcat = cat()

tomcat.bar()

多繼承

其實python是支援多繼承的,多繼承是乙個類可以有多個父類,當子類呼叫方法,子類中沒有會先去自己的方法中去找,如果沒有就從父類優先繼承的那個類中,在從父類的兄弟類中找,如果沒有在往上一級父類中去找該方法。下圖**可以演示這個問題。

class base(object):

def test(self):

print('-------base------')

class a(base):

def test(self):

print('-------a------')

class b(base):

def test(self):

print('-------b------')

class c(a,b):

def a(self):

print('addd')

c = c()

c.test()

self是類方法特有的乙個引數,普通函式是沒有的。定義類方法時,必須有乙個額外的引數,並且他必須是第乙個引數,它就是self。要注意的是,呼叫類方法時,並不需要給這個引數賦值,python會提供這個值。這個特別的引數指物件本身,按照慣例它的名稱是self,你也可以定義成其它名字,但是最好還是使用約定俗成的self。下例中將self改為myname一樣沒有錯誤。

class person: 

def __init__ (myname,name):

myname.name=name

def sayhi (myname): 

print 'hi,nice to meet you!

p=person() p.sayhi()

靜態方法,其實就是我們學過的函式,和函式唯一的區別是,靜態方法定義在類這個空間(類命名空間)中,而函式則定義在程式所在的空間(全域性命名空間)中。

靜態方法沒有類似 self、cls 這樣的特殊引數,因此 python 直譯器不會對它包含的引數做任何類或物件的繫結,也正是因為如此,此方法中無法呼叫任何類和物件的屬性和方法,靜態方法其實和類的關係不大。

靜態方法需要使用@staticmethod修飾,例如:

class bird:

# staticmethod修飾的方法是靜態方法

@staticmethod

def info (p):

print('靜態方法info: ', p)

靜態方法的呼叫,既可以使用類名,也可以使用類物件,例如:

#類名直接呼叫靜態方法

bird.info("類名")

#類物件呼叫靜態方法

b = bird()

b.info("類物件")

執行結果為:

靜態方法info:  類名

靜態方法info: 類物件

在使用 python 程式設計時,一般不需要使用類方法或靜態方法,程式完全可以使用函式來代替類方法或靜態方法。但是在特殊的場景(比如使用工廠模式)下,類方法或靜態方法也是不錯的選擇。至於靜態方法和類方法的具體應用場景,後續章節用到時再做詳細介紹。

對SQLiteOpenHelper類的理解

使用sqliteopenhelper對資料庫進行版本管理 因為我們開發的軟體可能會安裝在成百上千個使用者的手機上,如果應用使用到了sqlite資料庫,我們必須在使用者初次使用軟體時建立出應用使用到的資料庫表結構及新增一些初始化記錄,另外在軟體公升級的時候,也需要對資料表結構進行更新。那麼,我們如何才...

python 類 繼承 python 類的繼承

1 所用的類都可以被繼承 2 沒有繼承其他類的類必然有乙個父類 object 3子類可以擁有父類的 init 裡的類容 派生子類除了父類的一些屬性,還會有自己的屬性和方法,這些就叫派生 如何使用 實現 class animal def init self,name,attack,hp self.na...

聊聊python類中的self

在學習python類的時候會發現幾乎無一例外的會傳入引數self,self到底是什麼呢?其實 如下 class test def prt self print self print self.class t test t.prt 結果為 main test object at 0x104b6d410...