零基础学编程028:面向对象编程OOP

在《零基础学编程021:获取股票实时行情数据》一节中,我们想获取6支股票的行情数据,在《零基础学编程022:函数的世界》里我们能够把重复性的代码封装为一个函数price(),以后获得不同的股票行情只需调用函数即可,回顾一下这个函数的代码:

def price(stockCode) :
    url = 'http://hq.sinajs.cn/list=' + stockCode
    with req.urlopen(url) as f :
        hq = f.read().decode('GBK')
        v = hq.split(',')
        return v[1]

以后,我们还会写许多函数,比如获取股票的名称、取收盘价,取某日的行情等,当函数写得越来越多时,代码就会变得难以维护,这时需要用一种办法把同类的东西封装在一起,就要用到面向对象编程(OOP: Object Oriented Programming)的概念。

现代化的编程语言几乎都支持面向对象的概念,所以要尽快掌握面向对象编程的思路,程序员的世界里几乎全是对象函数

以股票程序为例,GAFATA中的google是股票,amazon是股票,facebook是股票,apple是股票,在计算机的世界里就把这些单一的个体称为对象(object),把这些对象的共性的抽象为类(class),在这个例子里,google、amazon、facebook,apple等都是一个一个的对象,而股票Stock就是

先来看股票Stock类的代码:

import urllib.request as req

class Stock :
    code = ""

    def __init__(self, code1) :
        self.code = code1

    def getPrice(self) :
        url = 'http://hq.sinajs.cn/list=' + self.code
        with req.urlopen(url) as f :
            hq = f.read().decode('GBK')
            v = hq.split(',')
            return v[1]

解释一下:

1)class Stock :

这一行语句,表示声明一个类,类的名称是Stock,后面一定要有冒号,以后的代码行要缩进,因为它们要描述类中的成员变量成员函数

2)code = ""

股票代码不同,则代表不同的股票对象,这里的code用来表示股票代码,例如:gb_goog,gb_amzn等。这个code称为成员变量

3)def __init__(self, code1) 函数

这个函数的写法有点特别,称为构造函数,用于完成一些初始化的任务,这里是把一个股票代码记录在self.code中。self是一个python中一个非常重要的关键字,表示对象本身,你要使用类中的变量时,就要用self后面加一个小点。

4)def getPrice(self) 函数

这个函数称为成员函数,这里把以前的price函数修改了一下,主要的变化就在于self.code。

上面的类的定义就完成了,类名叫Stock,有一个成员变量code,有一个成员函数getPrice(),在面向对象的概念里,这些函数也称为方法,英文是function或method。还有一个名称比较奇怪的函数,前后都有两个下划线,表示这个函数一般不给外界使用,只是给系统调用的。

这样就完成了一个股票类的封装,我们使用它时,只需构造一个对象,并调用相应的方法即可。

google = Stock("gb_goog") # 构造一个对象,谷歌股票,系统会自动调用__init__函数
print(google.getPrice()) # 取开盘价

amazon = Stock("gb_amzn") # 构造另一个对象,亚马逊
print(amazon.getPrice()) # 取开盘价

小结:

  • 现代语言都支持面向对象编程OOP,需尽早掌握
  • 相同的对象object抽象为类class
  • class关键字用于声明一个类
  • 成员变量用self访问
  • __init__是构造函数,完成一些初始化的任务
  • 面向对象里的函数,也称为方法,即function
  • Stock()就可以构造一个对象
  • 小圆点用来访问成员变量code对象的方法getPrice

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cs

递归算法

据说凡是可以循环的步骤,都可以递归表示出来。 递归的关键有二点: 1.0 递归公式,即递推式。 2.0 递归出口。 ---- 递归求数组的和 package...

3675
来自专栏绿巨人专栏

Category Theory: 01 One Structured Family of Structures

\(G = \{ G, +, e \}\),一个数据集\(G\),一个二元操作符\(+\),和一个幺元\(e\)。

1033
来自专栏我是攻城师

理解递归算法的原理

递归(Recursion)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。 递归式方法可以被用于解决很多的计算机科...

8551
来自专栏我和我大前端的故事

数据结构学习☞入门(一)算法数据结构

编程如果只是一个为了解决生活温饱的工具,那你可以完全忽略数据结构,算法,你的目标很容易实现;但如果你是热爱编程,把它当做对生活的追求,想在这一行走的更远,更久,...

873
来自专栏chenjx85的技术专栏

leetcode-169-Majority Element

2074
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第8章 函数式编程(FP)(1)第8章 函数式编程(FP)《Kotlin极简教程》正式上架:

"函数式编程", 又称泛函编程, 是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。它的基础是 λ 演算(lambda...

1042
来自专栏Python私房菜

翻译 | 更快的Python(二)

更快的Python使用代码示例来说明如何书写Python代码能带来更高的性能。本文对代码进行了讲解,从性能和可读性等角度来选择出最适合的写法。

843
来自专栏C语言及其他语言

[每日一题]矩阵问题

今天给大家分享的是二维数组的基本用法,主要是利用数组对行列的控制 题目描述 求一个3×3矩阵对角线元素之和。 输入 矩阵 输出 主对角线 副对角线 元素和 ...

3167
来自专栏Lambda

JavaScript排序算法详解

JS家的排序算法 引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把...

2708
来自专栏算法channel

其他|二维指针,数组指针,指针数组

望时间的流逝不仅仅丰富了我们的阅历,更重要的是通过提炼让我们得以升华,走向卓越。 1c++ c/c++的重要性毋庸置疑,凡是对性能要求很高的系统和算法,其中核...

2875

扫码关注云+社区