官术网_书友最值得收藏!

6.8 類的多態(tài)

所謂類的多態(tài)(polymorphism),就是類可以有許多個(gè)相同名稱但參數(shù)類型不同的函數(shù)。Python并沒有明顯的多態(tài)特性,因?yàn)镻ython函數(shù)的參數(shù)不必聲明數(shù)據(jù)類型。但是利用動態(tài)數(shù)據(jù)類型(dynamic typing), Python仍然可以處理對象的多態(tài)。

由于使用動態(tài)數(shù)據(jù)類型,Python必須等到運(yùn)行該函數(shù)時(shí)才知道該函數(shù)的類型,這種特性稱為運(yùn)行期綁定(runtime binding)。

C++將多態(tài)稱為方法重載(method overloading), C++可以允許類內(nèi)有許多個(gè)相同的名稱卻有不同參數(shù)的函數(shù)存在。

但是Python卻不允許這樣做,如果用戶在Python的類內(nèi)聲明多個(gè)相同的名稱卻有不同參數(shù)的函數(shù),Python會使用類內(nèi)最后一個(gè)聲明的函數(shù)。例如:

        >>>class myClass:
            def __init__(self):
                  pass
            def handle(self):
                  print ("3 arguments")
            def handle(self, x):
                  print ("1 arguments")
            def handle(self, x, y):
                  print ("2 arguments")
            def handle(self, x, y, z):
                  print ("3 arguments")

        >>> x = myClass()
        >>> x.handle(1, 2, 3)
        3 arguments
        >>> x.handle(1)
        Traceback (most recent call last):
          File "<pyshell#333>", line 1, in <module>
            x.handle(1)
        TypeError: handle() missing 2 required positional arguments: 'y' and 'z'

在上面這個(gè)例子中,當(dāng)調(diào)用myClass類中的handle()函數(shù)時(shí),Python會使用有3個(gè)參數(shù)的函數(shù)handle(self, x, y, z)。所以當(dāng)只提供一個(gè)參數(shù)時(shí),Python會輸出一個(gè)TypeError的異常。

要解決這個(gè)問題,必須使用下列變通方法。在myClass類中聲明的函數(shù)名稱都不相同,但是可以利用handle()函數(shù)的參數(shù)數(shù)目,來決定要調(diào)用類中的哪一個(gè)函數(shù)。

        >>> class myClass:
            def __init__(self):
                pass
            def handle(self, *arg):
                  if len(arg) == 1:
                    self.handle1(*arg)
                  elif len(arg) == 2:
                    self.handle2(*arg)
                  elif len(arg) == 3:
                      self.handle3(*arg)
                  else:
                    print ("Wrong arguments")
            def handle1(self, x):
                  print ("1 arguments")
            def handle2(self, x, y):
                  print ("2 arguments")
            def handle3(self, x, y, z):
                  print ("3 arguments")

        >>> x = myClass()
        >>> x.handle()
        Wrong arguments
        >>> x.handle(1)
        1 arguments
        >>> x.handle(1, 2)
        2 arguments
        >>> x.handle(1, 2, 3)
        3 arguments
        >>> x.handle(1, 2, 3, 4)
        Wrong arguments
主站蜘蛛池模板: 郯城县| 三台县| 彩票| 永州市| 固镇县| 东莞市| 边坝县| 轮台县| 远安县| 涿州市| 璧山县| 运城市| 黄冈市| 枣阳市| 应城市| 平乡县| 高要市| 佛教| 商水县| 北海市| 息烽县| 镇安县| 苗栗市| 贡嘎县| 湘乡市| 栾城县| 崇文区| 灵川县| 和田县| 信阳市| 锡林郭勒盟| 青神县| 马山县| 新沂市| 阳东县| 金昌市| 武乡县| 双峰县| 东安县| 察隅县| 长治市|