Python小技巧之 基類初始化

2021-07-04 12:09:44 字數 2009 閱讀 4194

>>> class base(object):

def __init__(self):

print('base init')

>>> class derived(base):

def __init__(self):

print('derived init')

super(derived, self).__init__()

>>> obj=derived()

derived init

base init

以上是最簡單的直接繼承用法,那如果是多繼承會是什麼情況呢?

>>> class base1(object):

def __init__(self):

print('base1 init')

>>> class base2(object):

def __init__(self):

print('base2 init')

>>> class derived(base1, base2):

def __init__(self):

print('derived init')

super(derived, self).__init__()

>>> obj=derived()

derived init

base1 init

從上面的結果可以看出,通過super的方式呼叫基類__init__實際只呼叫了第乙個繼承基類base1的__init__,而沒有呼叫第二個基類的__init__。

這個就涉及到python類的mro了,即method resolution order。

看看derived類的mro:

>>> help(derived)

help on class derived in module __main__:

class derived(base1, base2)

| method resolution order:

| derived

| base1

| base2

| __builtin__.object

上面的mro顯示了,尋找基類的方法會先查詢base1,然後再找base2,所以前面的例子呼叫了base1的__init__。

按照這種思路,那如果base1沒有定義__init__,是不是就該呼叫base2的__init__了呢?

我們來驗證一下:

>>> class base1(object):

pass

>>> class base2(object):

def __init__(self):

print('base2 init')

>>> class derived(base1, base2):

def __init__(self):

print('derived init')

super(derived, self).__init__()

>>> obj=derived()

derived init

base2 init

確實如此,呼叫了base2的__init__。

如果不想受到mro的影響,需要指定呼叫某些基類的__init__怎麼辦呢?

可以直接使用類名進行修飾:

>>> class derived(base1, base2):

def __init__(self):

print('derived init')

base2.__init__(self)

base1.__init__(self)

>>> obj=derived()

derived init

base2 init

base1 init

通過這種方式可以自行定製基類的初始化。

小技巧 陣列初始化

簡單說一下memset函式的使用方法。memset函式會把乙個型別的東西按位元組清空,乙個位元組是8位,所以按理講memset對int陣列實現統一賦值的操作的時候只能賦值0或者 1。如果不這樣的話,就會導致乙個迴圈出現。比如,你想對整個陣列賦值2的話,因為2的二進位制是10,八位的話就是0000,0...

虛擬基類的初始化

無論虛擬基類出現在繼承層次中的哪個位置上,它們都是在非虛擬基類之前被構造 虛擬基類的初始化成了最末層繼承類的責 namespace ex18 15 base string base const base protected string name class derived1 virtual pub...

虛基類的初始化

使用虛基類時,虛基類時被共享的,也就是在繼承體系中無論被繼承多少次,物件記憶體模型中均只會出現乙個虛基類的子物件,即使共享虛基類。但是必須要有乙個類來完成基類的初始化,同時還不能夠重複進行初始化。c 標準中選擇在每一次繼承子類中都必須書寫初始化語句,但是虛基類的初始化是由最後的子類完成,其他的初始化...