之前學C++,最重要的思想就是C++是一門面向對象的語言。
學習Python也到了高階篇了。
文章目錄
Python面向對象
1 面向對象簡介:
- 類(Class):用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
- 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用。
- 數據成員:類變量或實例變量,用於處理及其例對象的相關的數據。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋,也稱爲方法的重寫。
- 局部變量:定義在方法中的變量,只作用於當前實例的類。
- 實例變量:在類的聲明中,屬性是變量來表示的。這種變量就稱爲實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。
- 繼承:即一個派生類(derived class)繼承基類(bases class)的字段和方法。繼承也允許把一個派生類的對象作爲一個基類對象對待。
- 實例化:創建一個類的實例,類的具體對象。
- 方法:類中定義的函數。
- 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
2 創建類
使用class語句創建一個新類,class之後爲類的名稱並以冒號結尾。
class ClassName:
'類的幫助信息' # 類文檔字符串
class_suite # 類體
# 類的幫助信息可以通過ClassName.__doc__查看
# class_suite由類成員,方法,數據屬性組成
2.1 類對象
class test:
i = 6
def f(self):
return 'hello world'
# 實例化
x = test()
# 訪問類的屬性和方法
print("test類的屬性i爲:",x.i)
print("test類的方法f輸出爲:",x.f())
test類的屬性i爲: 6
test類的方法f輸出爲: hello world
類有一個名爲 __ init __ ()的構造方法,該方法在類實例化使會自動調用。
當然,__ init __ ()的構造方法可以有參數,參數通過__ init __ ()傳遞到類的實例化操作上。
class Complex:
def __init__(self,realpart,imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0,-4.0)
print(x.r, x.i)
3.0 -4.0
self代表類的實例,而非類
類的方法與普通的函數只有一個特別的區別:它們必須有一個額外的第一個參數名稱,按照慣例它的名稱是self。
class test:
def prt(self):
print(self)
print(self.__class__)
t = test()
t.prt()
<__main__.test object at 0x0000000004D26DA0>
<class '__main__.test'>
2.2 類的方法
在類的內部,使用def關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數self,且爲第一個參數,self代表的是類的實例。
class people:
# 定義基本屬性
name = ''
age = 0
# 定義私有屬性,私有屬性在類外部無法直接進行訪問
__weight = 0
# 定義構造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 說:我 %d 歲。" %(self.name,self.age))
# 實例化
p = people('hugh',10,30)
p.speak()
hugh 說:我 10 歲。
3 繼承
同C++比,Python也支持類的繼承。
派生類的定義:
class DerivedClassName(BaseClassName1):
<statement-1>
.
.
.
<statement-N>
3.1 單繼承
# 類定義
class people:
# 定義基本屬性
name = ''
age = 0
# 定義私有屬性,私有屬性在類外部無法直接進行訪問
__weight = 0
# 定義構造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 說:我 %d 歲。" %(self.name,self.age))
# 單繼承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
# 調用父類的構造函數
people.__init__(self,n,a,w)
self.grade = g
# 覆寫父類的寫法
def speak(self):
print("%s 說:我 %d 歲了,我在讀 %d 年級。" %(self.name,self.age,self.grade))
# 實例化
s = student('hugh',10,60,3)
s.speak()
hugh 說:我 10 歲了,我在讀 3 年級。
3.2 多繼承
# 類定義
class people:
# 定義基本屬性
name = ''
age = 0
# 定義私有屬性,私有屬性在類外部無法直接進行訪問
__weight = 0
# 定義構造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 說:我 %d 歲。" %(self.name,self.age))
class speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("我叫 %s,我是一個演說家,我演講的主題是 %s" %(self.name,self.topic))
# 單繼承
class student(people):
grade = ''
def __init__(self,n,a,w,g):
# 調用父類的構造函數
people.__init__(self,n,a,w)
self.grade = g
def speak(self):
print("%s 說:我 %d 歲了,我在讀 %d 年級。" %(self.name,self.age,self.grade))
# 多重繼承
class sample(speaker,student):
a = ''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test = sample("hugh",25,80,4,"Python3")
test.speak()
我叫 hugh,我是一個演說家,我演講的主題是 Python3
4 方法重寫
如果父類方法的功能不能滿足需求,可以在子類中重寫父類的方法。
class Parent:
def method(self):
print('調用父類的方法')
class Child(Parent):
def method(self):
print('調用子類的方法')
c = Child()
c.method()
super(Child,c).method()
調用子類的方法
調用父類的方法
5 更多
5.1 類的私有屬性
__private:兩個下劃線開頭,聲明該屬性爲私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.__private。
5.2 類的方法
在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self,且爲第一個參數,self 代表的是類的實例。
self 的名字並不是規定死的,也可以使用 this,但是最好還是按照約定是用 self。
class Private:
__private = 0 # 私有變量
public = 0 # 公開變量
def count(self):
self.__private += 1
self.public += 1
print(self.__private)
counter = Private()
counter.count()
counter.count()
print(counter.public)
print(counter.__private) # 報錯,實例不能訪問私有變量
1
2
2
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-12-eb258bd90cce> in <module>()
12 counter.count()
13 print(counter.public)
---> 14 print(counter.__private) # 報錯,實例不能訪問私有變量
AttributeError: 'Private' object has no attribute '__private'
5.3 類的私有方法
__private:兩個下劃線開頭,聲明該方法爲私有方法,只能在類的內部調用 ,不能在類的外部調用。self.__private。
class Site:
def __init__(self,name,url):
self.name = name
self.__url = url
def who(self):
print('name:',self.name)
print('url:',self.__url)
def __foo(self):
print('私有方法的調用')
def foo(self):
print('公共方法的調用')
self.__foo()
x = Site('CSDN個人主頁','https://me.csdn.net/MRZHUGH')
x.who()
x.foo()
x.__foo() #報錯 ,外錯不能調用私有方法
name: CSDN個人主頁
url: https://me.csdn.net/MRZHUGH
公共方法的調用
私有方法的調用
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-14-ac3466031d2a> in <module>()
18 x.who()
19 x.foo()
---> 20 x.__foo() #報錯 ,外錯不能調用私有方法
AttributeError: 'Site' object has no attribute '__foo'
5.4 類的專有方法:
- __ init __: 構造函數,在生成對象時調用
- __ del __: 析構函數,釋放對象時使用
- __ repr __: 打印,轉換
- __ setitem __:按照索引賦值
- __ getitem __:按照索引獲取值
- __ len __: 獲得長度
- __ cmp __: 比較運算
- __ call __: 函數調用
- __ add __: 加運算
- __ sub __: 減運算
- __ mul __: 乘運算
- __ truediv __: 除運算
- __ mod __: 求餘運算
- __ pow __: 乘方
參考引用:
革命尚未成功,同志仍需努力!