日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python类和对象详解_Python公开课 - 详解面向对象

發布時間:2025/3/19 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python类和对象详解_Python公开课 - 详解面向对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在C語言中,單純通過結構化的函數也可以實現很好的軟件,順序思路比較好理解;而C++則以面向對象的思維來進行代碼組織,通過定義對象、成員變量、成員函數、以封裝、繼承和多態等方式來更靈活處理業務邏輯。

Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。本章節我們將詳細介紹Python的面向對象編程。

理解對象和實例

對于初學者來說,這兩個詞太抽象,我們其實可以把他具象化來看?,F實生活中,經常會有一些流程規章辦法,我們要按照這些規章辦法來做事。

例如要考情流程,那么對于考情流程的定義,你可以把它理解就是一個類,而對于你每天實際考勤打卡的情況,就是這個類的實例了。

抽象點理解:類是定義,實例則是依賴于這個定義產生的具體行為集合。

面向對象的基本概念

類: 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。

類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。

成員變量:類變量或者實例變量用于處理類及其實例對象的相關的數據。

成員函數:類中定義的函數。

方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。

局部變量:定義在方法中的變量,只作用于當前實例的類。

實例變量:在類的聲明中,屬性是用變量來表示的。這種變量就稱為實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。

繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。

實例化:創建一個類的實例的過程,也就是創建一個類的具體對象。

對象:通過類定義的數據結構實例。

例如:

class Animal(object):

version = '1.0'

def __init__(self, name):

self.name = name

def getName(self):

return self.name

class Cat(Animal):

def __init__(self, name):

Animal.__init__(self, name)

self.nick_name = 'Tom'

def getNickName(self):

return self.nick_name

def getName(self):

prefix = "override"

return "[%s:]%s" %(prefix, self.name)

a = Cat('cat')

print(a.getName(), a.nick_name, a.getNickName())

輸出:

[override:]cat Tom Tom

示例說明:

class: 類定義關鍵字,即聲明以下代碼塊是一個類

version: 類變量

name, nick_name: 成員變量

getName, getNickName: 成員函數

prefix: 成員函數中的局部變量

a.nick_name: 實例變量

class Cat(Animal)::繼承,即Cat繼承于Animal

a = Cat('cat'): 實例化一個cat對象

a: 一個cat對象

封裝

我們定義一個類,需要將他的基本屬性進行封裝,例如定義一個學生類,他包含了名字和年齡兩個屬性及對應的get/set方法:

class Student:

def __init__(self):

self.name = ""

self.__age = 0 #定義私有屬性,私有屬性在類外部無法直接進行訪問

def setName(self, name):

self.name = name

def setAge(self, age):

self.__age = age

def getName(self):

return self.name

def getAge(self):

return self.__age

o = Student()

o.setName("Alex")

o.setAge(18)

print(o.getName(), o.getAge())

print(o.name)

print(o.__age)

輸出:

Alex 18

Alex

Traceback (most recent call last):

File "test13.py", line 25, in

print(o.__age)

AttributeError: 'Student' object has no attribute '__age'

示例說明:

__init__: 構造函數,該方法在類實例化時會自動調用

self: 相當于C++中的this關鍵字,代表是類的實例

__age: 聲明該屬性為私有,不能在類的外部被使用或直接訪問, 同理成員函數如果加上__也是一樣

繼承與多重繼承

在上面的例子中已經說明了Python如何進行繼承,下面我們闡述一下如何進行多重繼承

class A:

def say(self):

print('say hi')

class B:

def listen(self):

print('listen story')

class C:

def eat(self):

print('eat food')

class Multi(A, B, C):

def test(self):

pass

obj = Multi()

obj.say()

obj.listen()

obj.eat()

輸出:

say hi

listen story

eat food

注意:

需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索 即方法在子類中未找到時,從左到右查找父類中是否包含方法

多態

重載與重寫

重載是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數列表,即參數的數量或參數類型不能完全相同

重寫是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的參數表和相同的返回類型

class A:

def test1(self, a, b):

self.a = a

self.b = b

print('A.test1')

def test2(self, c):

self.c = c

print('A.test2')

class S(A):

def test1(self, a, b, c):

self.a = a

self.b = b

self.c = c

print('S.test1')

def test2(self, c):

print('S.test2')

a = A()

s = S()

a.test1(1, 2)

a.test2(1)

s.test1(1, 2, 3)

s.test2(1)

s.test1(1, 2)

輸出:

A.test1

A.test2

S.test1

S.test2

Traceback (most recent call last):

File "test15.py", line 30, in

s.test1(1, 2)

TypeError: test1() missing 1 required positional argument: 'c'

注意:

上面例子可以看出,雖然我們在子類S中重載了父類A的方法test1,但是執行報錯了,原因在于Python3中是不支持函數重載,因為 Python 可以接受任何類型的參數,如果函數的功能相同,那么不同的參數類型在 Python 中很可能是相同的代碼,沒有必要做成兩個不同函數。

也就是說,我們只需要將子類S稍作改動即可:

class S(A):

def test1(self, *attr):

self.attr = list(attr)

print('S.test1 %s' %self.attr)

def test2(self, c):

print('S.test2')

輸出:

A.test1

A.test2

S.test1 [1, 2, 3]

S.test2

S.test1 [1, 2]

獲取類的屬性

使用type()

判斷對象類型,使用type()函數

>>> type(S)

使用isinstance()

判斷class的類型,可以使用isinstance()函數

>>>isinstance(s, S)

True

>>>isinstance(s, A)

True

使用dir()

獲得一個對象的所有屬性和方法,可以使用dir()函數,它返回一個包含字符串的list

>>>dir(s)

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'attr', 'test1', 'test2']

相關閱讀

總結

以上是生活随笔為你收集整理的python类和对象详解_Python公开课 - 详解面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。