python面向对象举例

Posted 詩和遠方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python面向对象举例相关的知识,希望对你有一定的参考价值。

概述

面向对象三大特性:封装、继承、多态,本文通过类继承和方法覆盖的例子来说明python的面向对象编程。

功能说明

实现“数列”基类,然后通过继承的方式分别实现“等差数列”、“等比数列”、“斐波纳契数列”:

先实现一个具有数列通用属性和方法的基类,然后子类只需覆盖产生下一个元素的方法_advance即可。代码如下:

代码

基类

progression.py

class Progression:
    """迭代地产生数列,默认产生 0, 1, 2, ..."""

    def __init__ (self, start=0):
        """初始化数列第一个值"""
        self._current = start

    def _advance(self):
        """更新数据当前值为新值,此方法应该被继承类重写"""
        self._current += 1 

    def __next__(self):
        """返回下一个元素, 或抛出StopIteration异常"""
        if self._current is None: 
            raise StopIteration()
        else:
            answer = self._current    # 返回当前值
            self._advance()    # 准备下次的返回值
            return answer

    def __iter__(self):
        """按常规,返回自己作为迭代器"""
        return self

    def print_progression(self, n):
        """打印前n个数列"""
        print(' '.join(str(next(self)) for j in range(n)))

if __name__ == "__main__":
    print('默认数列:')
    pro = Progression()
    pro.print_progression(10)

    print('首项为3的数列:')
    pro = Progression(start=3)
    pro.print_progression(10)
默认数列:
0 1 2 3 4 5 6 7 8 9
首项为3的数列:
3 4 5 6 7 8 9 10 11 12

等差数列

arithmetic_progression.py

from progression import Progression

class ArithmeticProgression(Progression):
    """等差列数"""

    def __init__ (self, increment=1, start=0):
        """初始化
        increment:公差
        start:首项
        """
        super().__init__(start)      # 初始化基类
        self._increment = increment

    def _advance(self):              # 重写基类方法
        """增加公差,得到下一个值"""
        self._current += self._increment

if __name__ == "__main__":
    print('默认等差数列:')
    pro = ArithmeticProgression()
    pro.print_progression(10)
    
    print('首项为1,公差为3的等差数列:')
    pro = ArithmeticProgression(start=1,increment=3)
    pro.print_progression(10)
默认等差数列:
0 1 2 3 4 5 6 7 8 9
首项为1,公差为3的等差数列:
1 4 7 10 13 16 19 22 25 28

等比数列

geometric_progression.py

from progression import Progression

class GeometricProgression(Progression):
    """几何数列/等比数列"""

    def __init__ (self, base=2, start=1):
        """初始化

        base:等比数列的公比
        start:数据首项,默认为1
        """
        super().__init__(start)
        self._base = base

    def _advance(self):   # 重写基类方法
        """乘以公比,得到下一个元素"""
        self._current *= self._base

if __name__ == "__main__":
    print('默认等比列数:')
    pro = GeometricProgression()
    pro.print_progression(10)

    print('首项为5,公比为2的等比数列:')
    pro = GeometricProgression(start=5,base=2)
    pro.print_progression(10)
默认等比列数:
1 2 4 8 16 32 64 128 256 512
首项为5,公比为2的等比数列:
5 10 20 40 80 160 320 640 1280 2560

斐波纳契数列

fibonacci_progression.py

from progression import Progression

class FibonacciProgression(Progression):
    """斐波纳契数列"""

    def __init__ (self, first=0, second=1):
        """初始化
        first:第一元素
        second:第二元素
        """
        super().__init__(first)    # 初始化基类
        self._prev = second - first

    def _advance(self):    # 重写基类方法
        """后一个元素,等于前两个元素之和"""
        # temp = self._current
        # self._current = self._prev + self._current
        # self._prev = temp
        self._prev, self._current = self._current, self._prev + self._current

if __name__ == "__main__":
    print('默认斐波纳契数列:')
    pro = FibonacciProgression()
    pro.print_progression(10)

    print('前两位为3和4的斐波纳契数列:')
    pro = FibonacciProgression(first=3,second=4)
    pro.print_progression(10)
默认斐波纳契数列:
0 1 1 2 3 5 8 13 21 34
前两位为3和4的斐波纳契数列:
3 4 7 11 18 29 47 76 123 199

要点说明

  • python有一些固定的函数名用来实现特殊功能:
    • __init__构造函数,__next__返回下一个元素,支持next内置函数调用
    • 实现__next__方法之后就可以对象实例进行迭代(实现__len__和__getitem__亦可)
    • 其它特殊方法见python操作符重载特殊方法列表
  • python没有private、protected、public这样的成员变量与方法权限控制,但有命名惯例,下划线开头的代表非public的成员
  • 用super().__init__调用基类构造方法

以上是关于python面向对象举例的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象

python之面向对象

python笔记--面向对象

Python面向对象编程

VII python面向对象

Python第七章-面向对象