繼承和方法重寫

  • 單繼承
class DerivedClassName(BaseClassName1):
    <statement -1>
    .
    .
    <statement -N>
圓括號中須要注意
a、基類的順序,若基類中有相同的方法名,而雜誌類使用時未指定,Python 從左至右搜索,即方法在子類中未找到時,從左到右查找基類中是否包含方法
b、BaseClassName(示例中的基類名)必須與 派生類定義在一個做用域,除了類,還能夠用表達式,基類定義在另外一個模塊中時這點很是有用
#定義People類
class People:
    #定義基本屬性
    name = ''
    age = 0
    _weight = 0 #私有化的屬性,類外部沒法直接訪問
    #定義構造方法
    def __init__(self,name,age,_weight):
        self.name = name
        self.age =  age
        self._weight = _weight
    def speak(self):
        print ("%s 說:我 %s 歲 "%(self.name,self.age))

p = People('runob',10,30)
p.speak()

#單繼承
class Student(People):
    grade = ''
    def __init__(self,name,age,_weiht,grade):
        People.__init__(self,name,age,_weiht)   #引用父類的構造函數
        self.grade= grade
    def speak(self):                            #重寫父類的方法
        print ("%s 說:我 %s 歲了,我在讀 %s 年級"%(self.name,self.age,self.grade))

s = Student('ken',10,60,3)
s.speak()

#輸出結果
runob 說:我 10 歲 
ken 說:我 10 歲了,我在讀 3 年級
  • 多繼承
class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    <statement-N>
圓括號須要注意
a、父類的順序,若是父類中有相同的方法名,而在子類使用時未肯定,Python從左至右搜索,即方法在子類中未找到時,從左到右查找父類中是否包含方法
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# @Time    : 2017/8/17 0017 11:43
# @Author  : Aries
# @Site    :
# @File    : ss.py
# @Software: PyCharm Community Edition

# 類定義
class people:
    # 定義基本屬性
    name = ''
    age = 0
    # 定義私有屬性,私有屬性在類外部沒法直接進行訪問
    __weight = 0

    # 定義構造方法
    def __init__(self, n, a, w):
        self.name = n
        self.age = a
        self.__weight = w

    def speak(self):
        print("%s 說: 我 %d 歲。" % (self.name, self.age))


# 單繼承示例
class student(people):
    grade = ''

    def __init__(self, n, a, w, g):
        # 調用父類的構函
        people.__init__(self, n, a, w)
        self.grade = g

    # 覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級" % (self.name, self.age, self.grade))


# 另外一個類,多重繼承以前的準備
class speaker():
    topic = ''
    name = ''

    def __init__(self, n, t):
        self.name = n
        self.topic = t

    def speak(self):
        print("我叫 %s,我是一個演說家,我演講的主題是 %s" % (self.name, self.topic))


# 多重繼承
class sample(speaker, student):
    a = ''

    def __init__(self, n, a, w, g, t):
        student.__init__(self, n, a, w, g)
        speaker.__init__(self, n, t)


test = sample("Tim", 25, 80, 4, "Python")
test.speak()  # 方法名同,默認調用的是在括號中排前地父類的方法

#輸出
我叫 Tim,我是一個演說家,我演講的主題是 Python

  • 方法重寫
重寫是子類的方法覆蓋父類的方法,要求方法名和參數都相同
class Parent:
    def myMethod(self):
        print ("調用父類的方法")

class Child(Parent):
    def myMethod(self):        #重寫父類的方法
        print ("調用子類的方法")

c = Child()
c.myMethod()

#輸出
調用子類方法

  • 檢查繼承
想要查看一個類是不是另外一個的子類,能夠使用內建 issubclass() 函數
s = Student('ken',10,60,3)   #s是Studennt的實例
s.speak()
print issubclass(Student,People) #檢查一個類是不是另外一個類的子類,Student繼承了People
print Student.__bases__          #查看類的基類
print isinstance(s,Student)      #檢查一個對象是不是一個類的實例
相關文章
相關標籤/搜索