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__调用基类构造方法