面向对象有三大支柱:封装、继承和多态。后面两个概念在下一个章节中进行详细的说明,这里我们先说一下什么是封装。我自己对封装的理解是“隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口”。我们在类中定义的方法其实就是把数据和对数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以执行方法中的代码,也就是说我们只需要知道方法的名字和传入的参数(方法的外部视图),而不需要知道方法内部的实现细节(方法的内部视图)。
class Clock(object):
"""数字时钟"""
def __init__(self, hour=0, minute=0, second=0):
"""初始化方法
:param hour: 时
:param minute: 分
:param second: 秒
"""
self._hour = hour
self._minute = minute
self._second = second
def run(self):
"""走字"""
self._second += 1
if self._second == 60:
self._second = 0
self._minute += 1
if self._minute == 60:
self._minute = 0
self._hour += 1
if self._hour == 24:
self._hour = 0
def __str__(self):
"""显示时间"""
return '%02d:%02d:%02d' % \
(self._hour, self._minute, self._second)
def main():
clock = Clock(23, 59, 58)
while True:
print(clock)
sleep(1)
clock.run()
if __name__ == '__main__':
main()
练习2:定义一个类描述平面上的点并提供移动点和计算到另一个点距离的方法。
from math import sqrt
class Point(object):
def __init__(self, x=0, y=0):
"""初始化方法
:param x: 横坐标
:param y: 纵坐标
"""
self.x = x
self.y = y
def move_to(self, x, y):
"""移动到指定位置
:param x: 新的横坐标
"param y: 新的纵坐标
"""
self.x = x
self.y = y
def move_by(self, dx, dy):
"""移动指定的增量
:param dx: 横坐标的增量
"param dy: 纵坐标的增量
"""
self.x += dx
self.y += dy
def distance_to(self, other):
"""计算与另一个点的距离
:param other: 另一个点
"""
dx = self.x - other.x
dy = self.y - other.y
return sqrt(dx ** 2 + dy ** 2)
def __str__(self):
return '(%s, %s)' % (str(self.x), str(self.y))
def main():
p1 = Point(3, 5)
p2 = Point()
print(p1)
print(p2)
p2.move_by(-1, 2)
print(p2)
print(p1.distance_to(p2))
if __name__ == '__main__':
main()
说明:本章中的插图来自于Grady Booch等著作的《面向对象分析与设计》一书,该书是讲解面向对象编程的经典著作,有兴趣的读者可以购买和阅读这本书来了解更多的面向对象的相关知识。
案例1
# 输入两个数字,打印这两个数的
# 差,和、乘、除、整除、取余、平方
class YUantingting(object):
def __init__(self,a,b):
print(a+b,a-b,a*b)
YUantingting(1,2)
案例2
"""
定义3个函数,第一个函数:年龄判断 <18 ,18<40,40>
第二个函数:性别判断: 男,女,未知
第三个函数:打印 (年轻,中年,老年)和性别
"""
class Name(object):
def __init__(self,age,gener):
self.age = age
self.gener = gener
def Age(self):
if self.age <= 18:
print('年轻')
elif 18< self.age <= 40:
print('中年')
else:
print('老年')
def Gener(self):
if self.gener == '男':
print('您 ! 是! 男~')
elif self.gener == "女":
print('您 ! 是! 女~')
else:
print('您好~')
Joker = Name(18,'男')
Joker.Age()
Joker.Gener()
案例3
# 1.判断一个数字是不是素数.
# 2.数字时钟..(写闹钟,可以设定一个时间,打印闹钟响了)
"""
for xxx:
....
else:
....
当for循环能够顺利执行完毕,也就是说没有brek,则走else
否则else不走
for i in range(10):
print(i)
else:
print('hahah')
"""
class Name(object):
"""
判断一个数字是否是素数
"""
def __init__(self,num):
"""
Argus:
-----
num: int类型的数字
"""
self.num = num
def Check(self):
"""
检查self.num是不是素数
"""
for i in range(2,self.num):
if self.num % i == 0:
print('不是素数')
break
else:
print('是素数')
name = Name(11)
name.Check()