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面向对象举例的主要内容,如果未能解决你的问题,请参考以下文章