1六、python面對對象之類和繼承

 

前言:本文主要介紹python面對對象中的類和繼承,包括類方法、靜態方法、只讀屬性、繼承等。python

 

1、類方法


 1.類方法定義

  使用裝飾器@classmethod裝飾,且第一個參數必須是當前類對象,該參數名通常約定爲「cls",經過它來傳遞類的屬性和方法編程

(不能傳遞實例屬性和實例方法),跟實例方法的self用法類似。測試

2.類方法的調用

  實例對象和類對象均可以調用spa

3.應用場景

  在須要站在類的角度執行某個行爲時,那麼就能夠定義爲類方法code

class Student:

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

    def student_info(self):
        """實例方法"""
        print("-----student_info-----")
        print('name:{}'.format(self.name))
        print('age:{}'.format(self.age))

    @classmethod       # 帶有@classmethod標誌的就是類方法,@xxx 就是裝飾器
    def class_info(cls):  # cls與self的用法一致,self表明的是實例對象自己,cls表明的是類自己
        """類方法"""     # 應用場景:須要站在類的角度執行某個行爲時,就定義爲類方法
        print("-----class_info-----")
        print('在校學生')
        print("cls:", cls)


case = Student('張三', 22)
case.student_info()
case.class_info()  # 經過實例對象訪問類方法
Student.class_info()  # 經過類對象訪問類方法

運行結果:orm

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
-----student_info-----
name:張三
age:22
-----class_info-----
在校學生
cls: <class '__main__.Student'>
-----class_info-----
在校學生
cls: <class '__main__.Student'>

Process finished with exit code 0

 

2、靜態方法


 (瞭解便可,在自動化測試中暫時用不到)對象

1.靜態方法定義

  使用裝飾器@staticmethod裝飾,參數隨意,不須要「self「和「cls"參數,可是方法體中不能使用類或實例的任何屬性和方法blog

2.靜態方法的調用

  實例對象和類對象均可以調用繼承

3.應用場景

  用於存放純邏輯代碼,內部不須要引用類或實例的屬性和方法遊戲

class Student:

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

    def student_info(self):
        """實例方法"""
        print("-----student_info-----")
        print('name:{}'.format(self.name))
        print('age:{}'.format(self.age))

    @staticmethod       # 靜態方法不會牽涉到類和實例,裏面只存放邏輯代碼
    def static_move():  # 類和實例均可以調用靜態方法
        """靜態方法"""
        print("-----static_info-----")
        print('清華大學的學生')


case = Student('張三', 22)
case.student_info()
case.static_move()  # 經過實例對象訪問靜態方法
Student.static_move()  # 經過類對象訪問靜態方法

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
-----student_info-----
name:張三
age:22
-----static_info-----
清華大學的學生
-----static_info-----
清華大學的學生

Process finished with exit code 0

 

3、只讀屬性


 (瞭解便可,在自動化測試中暫時用不到)

1.只讀屬性定義

  使用裝飾器@property裝飾,須要一個self參數,即實例對象自己,用於定義一個屬性(通常指實例屬性),只能讀,不能寫入

2.只讀屬性的調用

  經過實例對象去調用

3.應用場景

  屬性只能讀,不能夠寫入或更改

class Student:

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

    def student_info(self):
        """實例方法"""
        print("-----student_info-----")
        print('name:{}'.format(self.name))
        print('age:{}'.format(self.age))

    @property
    def property(self):  # 定義一個只能用,不能改的屬性,瞭解便可
        """只讀屬性"""
        print("-----property_info-----")
        return 18


case = Student('張三', 22)
case.student_info()
print(case.property)  # 經過實例對象訪問只讀屬性

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
-----student_info-----
name:張三
age:22
-----property_info-----
18

Process finished with exit code 0

 

4、繼承


   在上一章的隨筆中也提到過,在python3中,全部的類都默認繼承自object這個父類(基礎類)。那麼什麼是繼承?繼承的做用是什麼呢?

1.繼承的定義及做用

  • 定義:面對對象編程中有一個很重要的思想叫繼承,子類能夠經過繼承得到父類的屬性和方法,被繼承的類叫父類(基類),

      繼承的類叫子類

  • 做用:子類能夠經過繼承得到父類的屬性和方法,從而提升開發的效率和代碼的複用

2.調用父類裏的方法

  子類的實例對象能訪問全部父類的實例方法,無論往上有幾層父類均可以訪問,但不能往下訪問本身的子類

class BasePhone(object):
    """定義一個手機基礎類"""
    def __init__(self, brand, model, price):
        self.brand = brand
        self.model = model
        self.price = price

    def phone_func(self):
        """手機功能"""
        print("這款手機是觸屏手機")
        print("這款手機是智能手機")
        print("這款手機有紅外線功能")
        print("這款手機有nfc功能")


class HonorPhone(BasePhone):
    """繼承手機基礎類,這是榮耀系列手機,基礎功能都有"""

    def phone_info(self):
        print("您的手機品牌是{},型號{},價格{}".format(self.brand,self.model,self.price))

    def honor_func(self):
        """榮耀功能"""
        print("這款手機支持HiFi")
        print("這款手機能夠玩mobile遊戲")
        print("這款手機支持應用分屏")


class HonorPorPhone(HonorPhone):
    """繼承手機基礎類,這是榮耀pro系列手機,基礎功能和榮耀功能都有"""

    def new_func(self):
        """新功能"""
        print("這款手機支持30倍變焦")


# 實例化對象,繼承後有最上層父類的初始化方法,須要傳三個參數
phone1 = HonorPorPhone('榮耀手機', 'Honor20pro', '¥3599')
phone1.phone_info()
phone1.phone_func()    # 調用最上層父類的方法(子類建立出來的對象能訪問全部父類的實例方法)
phone1.honor_func()   # 調用父類的方法
phone1.new_func()   # 調用本身的方法

phone2 = HonorPhone('榮耀手機', 'Honor20', '¥2999')
# 做爲HonorPorPhone類的父類,建立出來的對象不能訪問子類(即HonorPorPhone類)的實例方法,不能往下訪問
phone2.new_func()     # 所以這裏運行會報錯

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
您的手機品牌是榮耀手機,型號Honor20pro,價格¥3599
這款手機是觸屏手機
這款手機是智能手機
這款手機有紅外線功能
這款手機有nfc功能
這款手機支持HiFi
這款手機能夠玩mobile遊戲
這款手機支持應用分屏
這款手機支持30倍變焦
Traceback (most recent call last):
  File "D:/learn/python18_http_request/exercise/test.py", line 62, in <module>
    phone2.new_func()
AttributeError: 'HonorPhone' object has no attribute 'new_func'

Process finished with exit code 1

調用父類的屬性也是如此,這裏就再也不舉例了。

 

3.子類中調用重名的父類方法

  子類不只僅能夠調用父類的方法,也能夠重寫父類的方法再從新調用,簡單來講在子類中寫一個與父類同名的方法,而且也沿用父類方法裏的代碼,

只是在父類方法基礎上再增長一些代碼,子類重寫了父類的方法後,再調用父類方法的方式有兩種:

  • 方式一:父類名.方法名(self)

  • 方式二:super().方法名()

# -*- coding:utf8 -*-
"""
=================================
    Time    : 2019/10/8 21:04
    Author  : miki_peng
    Email   : 307325534@qq.com
    File    : day12_class_object.py
==================================
"""
# 繼承:在python3的繼承中,全部的類都默認繼承自object這個父類(基礎類)
# 兩種寫法都默認繼承object類
# class Phone:
#     pass
#
# class BasePhone(object):
#     pass


class BasePhone(object):
    """定義一個手機基礎類"""
    def __init__(self, brand, model, price):
        self.brand = brand
        self.model = model
        self.price = price

    def phone_func(self):
        """手機功能"""
        print("這款手機是觸屏手機")
        print("這款手機是智能手機")
        print("這款手機有紅外線功能")
        print("這款手機有nfc功能")


class HonorPhone(BasePhone):
    """繼承手機基礎類,這是榮耀系列手機,基礎功能都有"""

    def phone_info(self):
        print("您的手機品牌是{},型號{},價格{}".format(self.brand,self.model,self.price))

    def phone_func(self):
        """重寫父類的手機功能方法,在這基礎上增長一個功能"""
        print("這款手機有雙攝像頭")
        # BasePhone.phone_func(self)  # 重寫父類同名方法後,再調用父類的方法   第一種方式
        super().phone_func()    # 重寫父類同名方法後,再調用父類的方法   第二種方式(經常使用)

    def honor_func(self):
        """榮耀功能"""
        print("這款手機支持HiFi")
        print("這款手機能夠玩mobile遊戲")
        print("這款手機支持應用分屏")


class BetaPhone(BasePhone):    # 這個類沒有重寫父類的手機功能方法
    """繼承手機基礎類,這是Beta系列手機,有基礎功能"""

    def phone_info(self):
        print("您的手機品牌是{},型號{},價格{}".format(self.brand,self.model,self.price))

    def new_func(self):
        """新功能"""
        print("這款手機支持30倍變焦")


# 實例化對象,繼承後有最上層父類的初始化方法,須要傳三個參數
phone1 = HonorPhone('榮耀手機', 'Honor20', '¥2999')
phone1.phone_info()
phone1.phone_func()    # 調用父類的方法
phone1.honor_func()   # 調用本身的方法

print("-------------分割線------------")
phone2 = BetaPhone('Beta手機', 'Beta8', '¥3299')
phone2.phone_info()
phone2.phone_func()
phone2.new_func()

運行結果:

C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
您的手機品牌是榮耀手機,型號Honor20,價格¥2999
這款手機有雙攝像頭
這款手機是觸屏手機
這款手機是智能手機
這款手機有紅外線功能
這款手機有nfc功能
這款手機支持HiFi
這款手機能夠玩mobile遊戲
這款手機支持應用分屏
-------------分割線------------
您的手機品牌是Beta手機,型號Beta8,價格¥3299
這款手機是觸屏手機
這款手機是智能手機
這款手機有紅外線功能
這款手機有nfc功能
這款手機支持30倍變焦

Process finished with exit code 0

重寫父類方法後也能夠再也不調用父類方法,至關於把重名的方法從新寫一遍,若是以爲理解不了,本身多敲幾遍,觸類旁通練習一下吧!

 

 

做者:miki_peng

出處:https://www.cnblogs.com/miki-peng

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,請你們尊重原創,如要轉載,請在文章頁面明顯位置註明出處,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索