1. 程式人生 > >Python中多繼承與super()用法

Python中多繼承與super()用法

Python類分為兩種,一種叫經典類,一種叫新式類。兩種都支援多繼承。

考慮一種情形,B繼承於A,C繼承於A和B, 但C需要呼叫父類的init()函式時,前者會導致父類A的init()函式被呼叫2次,這是不希望看到的。而且子類要顯式地指定父類,不符合DRY原則。

# 經典類
class A():
    def __init__(self):
        print 'A'
class B(A):
    def __init__(self):
        A.__init__(self)
        print 'B'
class C(B, A):
    def __init__
(self):
A.__init__(self) B.__init__(self) print 'C'

採用新式類,要求最頂層的父類一定要繼承於object,這樣就可以利用super()函式來呼叫父類的init()等函式,每個父類都執行且執行一次,並不會出現重複呼叫的情況。而且在子類的實現中,不用到處寫出所有的父類名字,符合DRY原則。

# 新式類
class A(object):
    def __init__(self):
        print 'A'
class B(A):
    def __init__(self):
        super(B, self).__init__()
print 'B' class C(B, A): def __init__(self): super(C, self).__init__() print 'C'

採用super()方式時,會自動找到第一個多繼承中的第一個父類,但是如果還想強制呼叫其他父類的init()函式或兩個父類的同名函式時,就要用老辦法了。

class Person(object):
    name = ""
    sex = ""
    def __init__(self, name, sex='U'):
        print 'Person'
self.name=name self.sex=sex class Consumer(object): def __init__(self): print 'Consumer' class Student(Person, Consumer): def __init__(self, score,name): print Student.__bases__ super(Student, self).__init__(name, sex='F') Consumer.__init__(self) self.score=score s1 = Student(90, 'abc') print s1.name, s1.score, s1.sex