(09)-Python3之--類的三大特性(封裝、繼承、多態)


1、封裝

封裝,就是只能在類的內部訪問,外部訪問屬性或方法會報異常,python中的封裝很簡單,只要在屬性前或者方法名前加上兩個下划線就可以,如self.__name,def __eat(self)這樣就完成了屬性和方法的私有化,也就是封裝。
class hj:
    _arg = 'world'  # 封裝
    __kws = 'kws'   # 封裝
    def __init__(self):
        print(self._arg)   # 內部調用一個下划線的封裝
        print(self.__kws)  # 內部調用兩個下划線的封裝

    # 提供封裝訪問函數讓外部可以使用
    def get(self):
        print(self.__kws)

h = hj()
print(h._arg)   # 一個下划線的封裝 外部是可以調用的
#print(h.__kws)  # 兩個下划線的封裝 外部是無法調用的(其實是可以調用的,只不過python給你做個一個重名的操作(_hj__kws))
h.get()    # 通過封裝的方法來調用

2、繼承

官方解釋:所謂繼承指提供了同一類對象共性的處理方法,子類繼承父類共性的東西。 這樣有利於代碼的復用性,即子類擁有父類的方法。通過繼承創建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。

通俗講就是:父類的是子類的,子類的還是子類的。

python中繼承也非常簡單,定義一個Animal類,下面有一個eat()方法,再定義一個Dog類,Dog類中什么都不寫,用pass代替。然后實例化一個dog,讓dog繼承Animal類,dog可以使用eat()方法。
class Animal(object):
    def __init__(self,name):
        self.name = name
    def eat(self):
        print(self.name,"吃飯")

class Dog(Animal):
    pass
dog=Dog("旺財")
dog.eat()

結果:
旺財 吃飯

重寫:和父類的方法名稱一樣。但是在子類里面,重新實現。

  1、完全覆蓋

class Animal:

    def __init__(self,name,private_v1):
        self.name = name
        self._private_v1 = private_v1
        self.__private_v2 = "private_really"  # 私有化,不對子類開放

    def run(self):
        print("跑!!")

class Dog(Animal): # 繼承父類(Animal)

    def __init__(self,name,kind):
        self.name = name
        self.kind = kind

    def eat(self):
        print("一只名叫 {} 的 {} 在啃骨頭!!".format(self.name,self.kind))

    def run(self): # 重寫父類的run()方法
        print("我是一條狗,我有四條腿跑!!")

# 實例化
dog = Dog("二狗","哈士奇")
dog.run()
dog.eat()

結果:
我是一條狗,我有四條腿跑!!
一只名叫 二狗 的 哈士奇 在啃骨頭!!

  2、保留父類的做法,在它的基礎上再擴展其它的內容。(擴展方式:super())

    super()的2種表達:

      super().方法(參數列表)

      super(子類名,self).方法(參數列表)

class Animal:

    def __init__(self, name, private_v1):
        self.name = name
        self._private_v1 = private_v1
        self.__private_v2 = "private_really" 

    def run(self):
        print("跑!!")


class Dog(Animal):  # 繼承父類Animal

    def __init__(self, name, kind, private_v1):
        # 方法一
        super().__init__(name, private_v1)  # 調用父類現成的方法
        # 方法二
        # super(Dog,self).__init__(name)
        self.kind = kind  # 擴展子類自己的特性

    def eat(self):
        print("一只名叫 {} 的 {} 在啃骨頭!!".format(self.name, self.kind))

    def gogo(self):  # 完全顛覆父類的做法
        super().run()   # 父類做法
        print("我是一條狗,我有四條腿跑!!") # 我的做法

# 實例化
dog = Dog("小白","二哈","private_v1")
dog.eat()
dog.gogo()

結果:
一只名叫 小白 的 二哈 在啃骨頭!!
跑!!
我是一條狗,我有四條腿跑!!

多繼承:

在python中是可以多繼承的,繼承的先后順序是有區別的,當我們調用方法的時候,如果第一個繼承的找不到,才會去第二個中找,但是只要在第一個類中找到調用的那個方法,即使參數個數不匹配也不會調用第二個父類中的,此時會報錯。

class Student:
    def study(self):
        print("我是學生,我愛學習,我愛班級!")

class Employee:
    def work(self):
        print("我要賺錢,我要工作,我愛工作!!")

class People(Student,Employee): # 繼承Student類,Employee類

    def do_something(self):
        self.work()
        self.study()

p = People()
p.do_something()

結果:
我要賺錢,我要工作,我愛工作!!
我是學生,我愛學習,我愛班級!

3.多態

python中本質上是沒有真正多態這種思路,只是形式上有這樣一個多態的思路。

class Animal(object):
    def __init__(self,color):
        self.color=color
    def eat(self):
        print("吃飯")

class Cat(Animal):
    def eat(self):
        print("貓吃魚")

class Dog(Animal):
    def __init__(self,name,age,color):
        super(Dog,self).__init__(color)
        self.name=name
        self.age=age
    def eat(self):
        print("狗吃肉")
def feed(obj):
        obj.eat()

an=Animal("白色")#實例化Animal
cat=Cat("棕色")#實例化Cat
dog=Dog("小黃",2,"黃色")#實例化Dog

feed(an)
feed(cat)
feed(dog)

結果:
吃飯
貓吃魚
狗吃肉
定義了一個Animal父類,兩個子類Cat和Dog里面都有eat()方法,最后再定義一個feed()喂養方法,
傳入一個obj對象,調用obj.eat(),然后實例化Animal,Cat和Dog,分別在feed中傳入實例化對象an,cat和dog會分別打印出不同的語句,這個就是python中的多態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM