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公开课 - 详解面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arg是什么函数_C 语言编程 — 函数
- 下一篇: python怎么显示分数_在Python