天天看點

python面對對象三大特性

面對對象三大特性是:封裝,繼承,多态      
  • 封裝:

    也就是把客觀事物封裝成抽象的類,并且類可以把自己的資料和方法隻讓可信的類或者對象操作,對不可信的進行資訊隐藏。封裝是面向對象的特征之一,是對象和類概念的主要特性。 簡單的說,一個類就是一個封裝了資料以及操作這些資料的代碼的邏輯實體。在一個對象内部,某些代碼或某些資料可以是私有的,不能被外界通路。通過這種方式,對象對内部資料提供了不同級别的保護,以防止程式中無關的部分意外的改變或錯誤的使用了對象的私有部分。

  • 繼承:

    是指可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支援按級分類的概念。繼承是指這樣一種能力:它可以使用現有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴充。 通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實作繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實作。繼承概念的實作方式有二類:實作繼承與接口繼承。實作繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實作的能力;

  • 多态:

    就是指一個類執行個體的相同方法在不同情形有不同表現形式。多态機制使具有不同内部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。

  • 1.繼承的概述和定義格式

    繼承:

    子類繼承父類,子類一旦繼承父類,就擁有父類中非私有的屬性和方法.

    2.object類的介紹

object類:
  是所有類的父類,任何一個類預設都是繼承object類.      

3.子類不能繼承父類中私有的屬性和方法

class Father:

    def __init__(self, money, house):
        self.money = money
        self.house = house
        # 私有屬性
        self.__girl_friend = "ViVi"

    def run_company(self):
        print("父親經營公司...")

    # 私有方法
    def __tla(self):
        print(f"父親與{self.__girl_friend}談戀愛...")


# 子類繼承父類
class Son(Father):
    def test(self):
        # print(self.__girl_friend)
        self.__tla()


s = Son(200000000, "前門大街300平米的一套四合院")
print(s.money)
print(s.house)
s.run_company()

# print(s.__girl_friend)
s.test()      

4.子類中重寫父類中的方法

"""
重寫父類中的方法的原因:
    父類中的方法不能滿足子類的需要,但是子類又想保留這個方法名.
重寫父類中的方法:
    這就需要在子類中定義一個同名的方法,這叫重寫父類中的方法.
如何重寫:
    1.把父類中的方法複制粘貼到子類中
    2.在子類中修改方法體

特點:
    子類重寫了父類中的方法後,當通過子類對象調用這個方法時,調用的是子類中的這個方法.
"""


class Father: # class Father(object):

    def __init__(self, money, house):
        self.money = money
        self.house = house

    def run_company(self):
        print("父親經營公司...")


# 子類繼承父類
class Son(Father):
    # 重寫了父類中的run_company方法
    def run_company(self):
        print("兒子經營公司...")



s = Son(200000000, "前門大街300平米的一套四合院")
print(s.money)
print(s.house)
s.run_company()      

5.在子類中調用父類中被重寫的方法

"""
調用 父類中的被重寫的run_company方法,有三種格式:
    1.父類名.方法名(self, 實參1,實參2,...)
    2.super(子類名,self).方法名(實參1,實參2,...)
    3.super().方法名(實參1,實參2,...)
"""
class Father: # class Father(object):

    def __init__(self, money, house):
        self.money = money
        self.house = house

    def run_company(self):
        print("父親經營公司...")


# 子類繼承父類
class Son(Father):
    # 重寫了父類中的run_company方法
    def run_company(self):
        print("兒子經營公司...")

    def test(self):
        # 調用的是子類中的run_company方法
        # self.run_company()

        # 調用 父類中的run_company方法
        # 1.父類名.方法名(self, 實參1,實參2,...)
        # Father.run_company(self)
        # 2.super(子類名,self).方法名(實參1,實參2,...)
        # super(Son, self).run_company()
        # 3.super().方法名(實參1,實參2,...)
        super().run_company()

s = Son(200000000, "前門大街300平米的一套四合院")
s.test()      

6.繼承中的兩個細節

1.如何在子類中通路中的私有屬性和私有方法

class Father:

    def __init__(self, money, house):
        self.money = money
        self.house = house
        # 私有屬性
        self.__girl_friend = "ViVi"

    def run_company(self):
        print("父親經營公司...")

    # 私有方法
    def __tla(self):
        print(f"父親與{self.__girl_friend}談戀愛...")

    def test(self):
        """
        通路私有屬性和方法
        """
        print(f"兒子像跟{self.__girl_friend}說句話...")
        self.__tla()


# 子類繼承父類
class Son(Father):
    def la(self):

        # 調用從父類中繼承的test方法
        self.test()


s = Son(200000, "5套别墅")
s.test()
# 如上代碼,兒子通過繼承父親的方法找到了父親的小娘子搞了事情      
class Father:

    def __init__(self, money, house):
        self.money = money
        self.house = house

    def run_company(self):
        print("父親經營公司...")


class Son(Father):
    # 重寫了父類中的init方法
    def __init__(self, name, money, house):
        self.name = name
        # 使用第三種格式調用父類中的__init__方法
        super().__init__(money, house)


s = Son("聰聰", 2000000000, "5套别墅")
print(s.name)
print(s.money)
print(s.house)      

​ 2.如果子類中也定義了__init__方法,子類如何繼承父類中定義的屬性

self.name = name      

7.多層繼承

一層一層的繼承;      

8.多繼承的格式

一個子類同時繼承多個父類.

多繼承的格式:

  class 子類名(父類1, 父類2, ...):
    子類中的代碼      

9.多繼承-父類中有相同init的方法

"""
多繼承的格式:

    class 子類名(父類1, 父類2, ...):
        子類中的代碼
"""
class A:
    def __init__(self, a):
        self.a = a

    def methodA(self):
        print("---------methodA---------")

    def show(self):
        print("show from A")


class B:
    def __init__(self, b):
        self.b = b

    def methodB(self):
        print("---------methodB---------")

    def show(self):
        print("show from B")


# 讓C類同時繼承A,B兩個父類
class C(A, B):

    # 為了繼承A,B兩個父類中的屬性,需要重寫init方法,在方法中調用兩個父類中的init方法
    def __init__(self, a, b):
        # 調用A,B類中的init方法
        A.__init__(self, a)
        B.__init__(self, b)


c = C("a的屬性", "b的屬性")

print(c.a)
print(c.b)

c.methodA()
c.methodB()
c.show()      

10.多繼承-調用指定父類中的方法

"""
多繼承的格式:

    class 子類名(父類1, 父類2, ...):
        子類中的代碼
"""
class A:
    def __init__(self, a):
        self.a = a

    def methodA(self):
        print("---------methodA---------")

    def show(self):
        print("show from A")


class B:
    def __init__(self, b):
        self.b = b

    def methodB(self):
        print("---------methodB---------")

    def show(self):
        print("show from B")


# 讓C類同時繼承A,B兩個父類
class C(A, B):

    # 為了繼承A,B兩個父類中的屬性,需要重寫init方法,在方法中調用兩個父類中的init方法
    def __init__(self, a, b):
        # 調用A,B類中的init方法
        A.__init__(self, a)
        B.__init__(self, b)

    def test(self):
        # 調用A類中的show方法
        # self.show()
        A.show(self)
        # 調用B類中的方法
        B.show(self)


c = C("a的屬性", "b的屬性")

c.test()      

11.執行個體屬性和執行個體方法

執行個體:
  就是對象.
  
執行個體對象:
  通過類名 建立的 對象.      

執行個體屬性:

給執行個體對象添加的屬性.
  
  執行個體屬性是存儲執行個體對象裡面的.
  
  執行個體屬性 是 屬于 執行個體對象的.
  
執行個體方法:

  第一個形參是self的方法.
  盡管執行個體方法 是 存儲在 類裡面的,但是它 屬于 執行個體對象.
  
執行個體屬性和執行個體方法,都必須通過執行個體對象通路.      

12.類對象 類屬性

類對象:
  也是一個對象.
  
  一個類 就是一個 類對象.
  類對象的名字 就是 類的 名字.      

類屬性:

也是 一種 屬性.

它存儲的資料,是所有的執行個體對象共享共用的資料,不屬于某一個執行個體對象專有.是所有的執行個體對象共有的.

當這個資料 是所有的執行個體對象共享共用時,才使用 一個類屬性 存儲這個資料.
  
定義類屬性的格式:
  在類的裡面,方法的外面定義的屬性(變量).      

13.類方法

"""

"""



class Student:

    __kongtiao = "格力空調"

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    """
    定義類方法:
        1.在方法定義的那一行的上面,使用@classmethod裝飾器
            這個裝飾器的作用:
                1.用來表示下面的方法是一個類方法的
                2.在調用類方法時,python解釋器會自動把類名傳遞cls
        2.第一個形參必須是cls,表示類對象,就是那個類名
        
    通路方式:
        1.執行個體對象.類方法名(實參1,實參2,...)
        2.類對象.類方法名(實參1,實參2,...)(推薦的方式)
    特點:
        1.在調用類方法時,python解釋器會自動把類對象傳遞給cls
        2.隻能通路類屬性或者類方法,不能通路執行個體屬性或者執行個體方法
        
    什麼時候定義一個類方法?
        在方法中隻需要通路類屬性或者類方法,不通路執行個體屬性或者執行個體方法.
    """
    @classmethod
    def study(cls):
        print(cls.__kongtiao)
        cls.show()

    @classmethod
    def show(cls):
        print("我是類方法...")


# 1.執行個體對象.類方法名(實參1,實參2,...)
s = Student("張柏芝", 38, "女")
s.study()
# 2.類對象.類方法名(實參1,實參2,...)
Student.study()      

14.靜态方法

class Student:

    __kongtiao = "格力空調"

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    """
    定義靜态方法的步驟:
        1.在方法定義的那一行的上面,使用@staticmethod裝飾器
            1.辨別下面的方法時靜态方法
        2.方法的第一個形參,既不是self也不是cls.
        
    特點:
        在方法中不能通路執行個體屬性和執行個體方法了,因為在它裡面得不到self
        通常在這個方法中不通路執行個體屬性和執行個體方法也不通路類屬性和類方法.
        
    通路方式:
         1.執行個體對象.類方法名(實參1,實參2,...)
         2.類對象.類方法名(實參1,實參2,...)(推薦的方式)
         
    在什麼時候定義靜态方法?
        當在這個方法中既不通路執行個體屬性執行個體方法,也不通路類屬性類方法時.
    """
    @staticmethod
    def study():
        print("挖掘技術哪家強,")
        print("欲學技術到藍翔.")
        print("學完技術包配置設定,")
        print("尼瑪還是富士康!")

    def test(self):
        jingtai.EncodeUtils.encode("hello", "utf-8")
        self.study()
        Student.study()

# 1.執行個體對象.類方法名(實參1,實參2,...)
s = Student("張柏芝", 38, "女")

# s.study()
# Student.study()

s.test()      
# 定義父類
class Father:
    def cure(self):
        print("父親給病人治病...")


# 定義子類繼承父類
class Son(Father):
    # 重寫父類中的方法
    def cure(self):
        print("兒子給病人治病...")


"""

鴨子類型:
    
"""

# 定義函數,在裡面 調用 醫生的cure函數
def call_cure(doctor):

    # 調用醫生治病的方法
    doctor.cure()


# 建立父類對象
father = Father()
# 調用函數,把父類對象傳遞函數
call_cure(father)


# 建立子類對象
son = Son()
# 調用函數,把子類對象傳遞函數
call_cure(son)      
把8個老師 随機配置設定到 3個辦公室.