一文講全了Python 類和物件內容

華為雲開發者社群 發表於 2021-06-17
Python

摘要:這是一個關於 Python 類和物件的全部內容。

本文分享自華為雲社群《從零開始學python | Python 類和物件—物件導向程式設計》,原文作者:Yuchuan  。

Python 在活躍開發人員方面將超過其他語言之後,Python 開發人員的需求只會增長。 Python 遵循物件導向的程式設計正規化。它處理宣告 python 類,從它們建立物件並與使用者互動。在物件導向的語言中,程式被分成獨立的物件,或者你可以說成幾個小程式。每個物件代表應用程式的不同部分,它們可以相互通訊。

在這個python類部落格中,您將按以下順序瞭解類和物件的各個方面:

  • What is a Python Class?
  • Methods and Attributes in a class
  • What are Objects?
  • OOPs Concepts:
    • Inheritance
    • Polymorphism
    • Abstraction

什麼是 Python 類?

python 中的類是建立特定物件的藍圖。它使您可以以特定方式構建軟體。問題來了,怎麼辦?類允許我們以一種易於重用的方式對我們的資料和函式進行邏輯分組,並在需要時進行構建。考慮下圖。

ClassesAndObjects - Python 類 - Edureka

在第一張圖片 (A) 中,它代表了一個可以被視為Class的房子的藍圖。使用相同的藍圖,我們可以建立多個房屋,這些可以視為Objects。使用類,您可以為您的程式新增一致性,以便以更簡潔、更有效的方式使用它們。屬性是通過點表示法訪問的資料成員(類變數和例項變數)和方法。

  • 類變數是一個類的所有不同物件/例項共享的變數。
  • 例項變數是每個例項唯一的變數。它是在方法內部定義的,並且只屬於類的當前例項。
  • 方法也稱為函式,它們在類中定義並描述物件的行為。

現在,讓我們繼續前進,看看它在 PyCharm 中是如何工作的。要開始,首先看一下 python 類的語法。

語法:

class Class_name:
statement-1
.
.
statement-N

在這裡,“ class” 語句建立了一個新的類定義。類的名稱緊跟 在python中的關鍵字“ class”之後,後跟一個冒號。要在 python 中建立一個類,請考慮以下示例:

class employee:
 pass
 #no attributes and methods
 emp_1=employee()
 emp_2=employee()
 #instance variable can be created manually
 emp_1.first='aayushi'
 emp_1.last='Johari'
 emp_1.email='[email protected]'
 emp_1.pay=10000
 
emp_2.first='test'
 emp_2.last='abc'
 emp_2.email='[email protected]'
 emp_2.pay=10000
 print(emp_1.email)
 print(emp_2.email)

輸出–

現在,如果我們不想手動設定這些變數怎麼辦。你會看到很多程式碼,而且很容易出錯。所以為了讓它自動,我們可以使用“init”方法。為此,讓我們瞭解一下 Python 類中的方法和屬性到底是什麼。

Python 類中的方法和屬性

如果沒有一些功能,現在建立一個類是不完整的。因此,可以通過設定各種屬性來定義功能,這些屬性充當與這些屬性相關的資料和功能的容器。python 中的函式也稱為方法。談到init方法,它是一個特殊的函式,每當例項化該類的新物件時都會呼叫它。您可以將其視為 initialize 方法,或者如果您來自任何其他物件導向的程式設計背景,例如 C++、Java 等,則可以將其視為建構函式。現在當我們在類中設定方法時,它們會自動接收例項。讓我們繼續使用 python 類並使用此方法接受名字、姓氏和薪水。

class employee:
    def __init__(self, first, last, sal):
        self.fname=first
        self.lname=last
        self.sal=sal
        self.email=first + '.' + last + '@company.com'
 
emp_1=employee('aayushi','johari',350000)
emp_2=employee('test','test',100000)
print(emp_1.email)
print(emp_2.email)

現在在我們的“init”方法中,我們設定了這些例項變數(self、first、last、sal)。Self 是例項,這意味著每當我們寫 self.fname=first 時,它與 emp_1.first='aayushi' 相同。然後我們建立了員工類的例項,我們可以在其中傳遞 init 方法中指定的值。此方法將例項作為引數。現在它將自動完成,而不是手動完成。

接下來,我們希望能夠執行某種操作。為此,我們將向 此類新增一個 方法。假設我想要顯示員工全名的功能。因此,讓我們實際實現這一點。

class employee:
    def __init__(self, first, last, sal):
        self.fname=first
        self.lname=last
        self.sal=sal
        self.email=first + '.' + last + '@company.com'
 
    def fullname(self):
            return '{}{}'.format(self.fname,self.lname)
 
emp_1=employee('aayushi','johari',350000)
emp_2=employee('test','test',100000)
print(emp_1.email)
print(emp_2.email)
print(emp_1.fullname())
print(emp_2.fullname())

輸出–

[email protected] 
 [email protected] 
 aayushijohari 
 TESTTEST

正如你在上面看到的,我在一個類中建立了一個名為“全名”的方法。因此,python 類中的每個方法都會自動將例項作為第一個引數。現在在這個方法中,我編寫了列印全名並返回這個而不是 emp_1 名字和姓氏的邏輯。接下來,我使用了“self”,以便它適用於所有例項。因此每次都列印這個,我們使用一個方法。

繼續使用 Python 類,有一些變數在類的所有例項之間共享。這些被稱為類變數。例項變數對於每個例項都可以是唯一的,例如姓名、電子郵件、sal 等。複雜嗎?讓我們通過一個例子來理解這一點。請參閱下面的程式碼以瞭解工資的年度增長情況。

class employee:
    perc_raise =1.05
    def __init__(self, first, last, sal):
        self.fname=first
        self.lname=last
        self.sal=sal
        self.email=first + '.' + last + '@company.com'
 
    def fullname(self):
            return '{}{}'.format(self.fname,self.lname)
    def apply_raise(self):
        self.sal=int(self.sal*1.05)
 
emp_1=employee('aayushi','johari',350000)
emp_2=employee('test','test',100000)
 
print(emp_1.sal)
emp_1.apply_raise()
print(emp_1.sal)

輸出–

350000
 367500

正如你在上面看到的,我先列印了工資,然後應用了 1.5% 的增長。為了訪問這些類變數,我們需要通過類或類的例項來訪問它們。現在,讓我們瞭解 Python 類中的各種屬性。

Python 類中的屬性

Python 中的屬性定義了物件、元素或檔案的屬性。有兩種型別的屬性:

  • 內建類屬性: Python 類中存在各種內建屬性。例如_dict_、_doc_、_name _ 等。讓我舉同樣的例子,我想檢視employee1 的所有鍵值對。 為此,您可以簡單地編寫以下包含類名稱空間的語句:
  • 列印(emp_1.__dict__)

執行之後,你會得到這樣的輸出:{'fname': 'aayushi', 'lname': 'johari', 'sal': 350000, 'email': '[email protected]'}

  • 使用者定義的屬性:屬性是在類定義中建立的。我們可以為類的現有例項動態建立新屬性。屬性也可以繫結到類名。

接下來,我們有public、protected 和private屬性。讓我們詳細瞭解它們:

一文講全了Python 類和物件內容

接下來,讓我們瞭解一個python類中最重要的元件,即Objects。

物件 - python 類 - Edureka

正如我們上面討論的,一個物件可以用來訪問不同的屬性。它用於建立類的例項。例項是在執行時建立的類的物件。

給你一個快速瀏覽,物件主要是看到周圍的一切。例如:狗是動物類的物件,我是人類類的物件。同樣,同一個電話類可以有不同的物件。 這與我們已經討論過的函式呼叫非常相似。讓我們通過一個例子來理解這一點:

class MyClass:
 
   def func(self):
      print('Hello')
 
# create a new MyClass
ob = MyClass()
ob.func()

繼續使用 python 類,讓我們瞭解各種 OOP 概念。

物件導向的概念

OOPs 指的是 Python 中的物件導向程式設計。好吧,Python 並不是完全物件導向的,因為它包含一些過程函式。現在,您一定想知道過程程式設計和麵向物件程式設計之間有什麼區別。為了消除您的疑問,在程式式程式設計中,整個程式碼都被寫入一個長過程,即使它可能包含函式和子例程。由於資料和邏輯混合在一起,因此無法管理。但是當我們談論物件導向程式設計時,程式被拆分為獨立的物件或幾個小程式。每個物件代表應用程式的不同部分,這些部分有自己的資料和邏輯來在它們之間進行通訊。例如,一個網站有不同的物件,如影像、視訊等。 

物件導向程式設計包括Python類、物件、繼承、多型、抽象等概念,下面讓我們詳細瞭解這些主題。

Python 類:繼承

繼承允許我們從基類/父類繼承屬性和方法。這很有用,因為我們可以建立子類並從父類中獲取所有功能。然後我們可以在不影響父類的情況下覆蓋和新增新功能。讓我們通過一個例子來理解父類和子類的概念。

繼承-python類-edureka

正如我們在影像中看到的,孩子繼承了父親的屬性。同樣,在python中,有兩個類:

1. 父類(Super 或 Base 類)

2.子類(子類或派生類)

繼承屬性的類稱為子類,而繼承屬性的類稱為父類。

繼承是指建立包含其父類的專業化的子類的能力。它進一步分為四種型別,即單繼承、多級繼承、分層繼承和多重繼承。請參考下圖以獲得更好的理解。

TypesOfInheriance - Python 類 - Edureka

讓我們繼續使用 python 類並瞭解繼承是如何有用的。

比如說,我想為員工型別建立類。我將建立 'developers' 和 'managers' 作為子類,因為開發人員和經理都有姓名、電子郵件和薪水,所有這些功能都在員工類中。因此,我們不必複製子類的程式碼,而是可以通過從員工那裡繼承來簡單地重用程式碼。 

class employee:
    num_employee=0
    raise_amount=1.04
    def __init__(self, first, last, sal):
        self.first=first
        self.last=last
        self.sal=sal
        self.email=first + '.' + last + '@company.com'
        employee.num_employee+=1
    def fullname (self):
        return '{} {}'.format(self.first, self.last)
    def apply_raise (self):
        self.sal=int(self.sal * raise_amount)
class developer(employee):
    pass
 
emp_1=developer('aayushi', 'johari', 1000000)
print(emp_1.email)

正如您在上面的輸出中看到的,employee 類的所有詳細資訊都可以在 developer 類中找到。 現在,如果我想將開發人員的 raise_amount 更改為 10% 怎麼辦?讓我們看看它是如何實際完成的。

class employee:
    num_employee=0
    raise_amount=1.04
    def __init__(self, first, last, sal):
        self.first=first
        self.last=last
        self.sal=sal
        self.email=first + '.' + last + '@company.com'
        employee.num_employee+=1
    def fullname (self):
        return '{} {}'.format(self.first, self.last)
    def apply_raise (self):
        self.sal=int(self.sal* raise_amount)
 
class developer(employee):
    raise_amount = 1.10
 
emp_1=developer('aayushi', 'johari', 1000000)
print(emp_1.raise_amount)
輸出- 1.1

如您所見,它已將工資增長百分比從 4% 更新為 10%。 現在,如果我想再新增一個屬性,比如在我們的 init 方法中使用一種程式語言,但它在我們的父類中不存在。有什麼解決辦法嗎?是的!我們可以複製整個員工邏輯並這樣做,但它會再次增加程式碼大小。因此,為了避免這種情況,讓我們考慮以下程式碼:

class employee:
    num_employee=0
    raise_amount=1.04
    def __init__(self, first, last, sal):
        self.first=first
        self.last=last
        self.sal=sal
        self.email=first + '.' + last + '@company.com'
        employee.num_employee+=1
    def fullname (self):
        return '{} {}'.format(self.first, self.last)
    def apply_raise (self):
        self.sal=int(self.sal* raise_amount)
class developer(employee):
    raise_amount = 1.10
    def __init__(self, first, last, sal, prog_lang):
        super().__init__(first, last, sal)
        self.prog_lang=prog_lang
 
emp_1=developer('aayushi', 'johari', 1000000, 'python')
print(emp_1.prog_lang)

因此,只用一點點程式碼,我就進行了更改。我使用了 super.__init__(first, last, pay) 它繼承了基類的屬性。 總之,繼承用於重用程式碼並降低程式的複雜性。

Python 類:多型性

電腦科學中的多型性是為不同的底層形式呈現相同介面的能力。實際上,多型意味著如果類 B 從類 A 繼承,它不必繼承關於類 A 的所有內容,它可以做一些與類 A 不同的事情。它最常用於處理繼承。Python 是隱式多型的,它能夠過載標準運算子,以便它們根據上下文具有適當的行為。

讓我們通過一個例子來理解:

class Animal:
    def __init__(self,name):
        self.name=name
        def talk(self):
            pass
class Dog(Animal):
            def talk(self):
                print('Woof')
class Cat(Animal):
    def talk(self):
        print('MEOW!')
c= Cat('kitty')
c.talk()
d=Dog(Animal)
d.talk()

輸出 -

Meow!
Woof

接下來,讓我們轉向另一個物件導向的程式設計概念,即抽象。

Python 類:抽象

抽象用於通過建模適合問題的類來簡化複雜的現實。在這裡,我們有一個無法例項化的抽象類。這意味著您不能為這些類建立物件或例項。它只能用於繼承您稱為基類的某些功能。因此,您可以繼承功能,但同時,您無法建立此特定類的例項。讓我們通過下面的例子來理解抽象類的概念:

from abc import ABC, abstractmethod     
 
class Employee(ABC):
    @abstractmethod
 
    def calculate_salary(self,sal):
        pass
 
class Developer(Employee):
 
    def calculate_salary(self,sal):
        finalsalary= sal*1.10
        return  finalsalary
 
emp_1 = Developer()
print(emp_1.calculate_salary(10000))

輸出–

11000.0

正如你在上面的輸出中看到的,我們已經將基本工資增加到 10%,即現在的工資是 11000。現在,如果你真的繼續建立一個“Employee”類的物件,它會丟擲一個錯誤,因為 python 不會'不允許你建立抽象類的物件。但是使用繼承,您實際上可以繼承屬性並執行相應的任務。

 

點選關注,第一時間瞭解華為雲新鮮技術~