什么是面向对象?
程序中的数据和函数是一个逻辑上的整体,可以称之为对象。解决问题的方式就是创造出需要的对象,并向对象发出消息,多个对象一起工作,各司其职,最终就能构造出复杂的系统来解决现实中的问题。
类和对象
简言之,类是对象的蓝图和模板,对象是类的实例。类是一个抽象的概念,而对象是具体的东西。
面向对象编程的世界中一切皆对象,对象都有属性和行为,每个对象都是独一无二的。我们把拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来,就可以定义一个叫做“类”的东西。
定义一个类
class Student(object):
#__init__是一个特殊方法用于创建对象时初始化
#通过这个方法可以给学生绑定两个属性
#name 和 age
def __init__(self,name,age):
self.name = name
self.age = age
def study(self,course_name):
print('%s正在努力学习%s'%(self.name,course_name))
def watch_movie(self):
if self.age < 18:
print('%s只能看熊出没'%self.name)
else:
print('%s可以看岛国小电影'%self.name)
#写在类中的函数,通常称之为对象的方法,这些方法就是对象可以接收的消息
创建和使用对象
def main():
#创建学生对象并指明姓名年龄
stu1 = Student('zhangsan',21)
#让这个对象学习
stu1.study('python程序设计')
#让对象看电影
stu1.watch_movie()
if __name__=='__main__':
main()
访问可见性
对面向对象有了解的一般都知道访问权限的问题,在C++中有private,protected,public三种,分别代表私有,保护和公有。通常情况下,我们会把属性设置为私有或保护,而把方法设置为公有,这样可以保护数据的私密性。
在python中,属性和方法的访问权限只有两种,就是公开和私有,如果希望属性时私有的,在给属性命名时需要多加两个下划线作为开头。
class Test:
def __init__(self,foo):
self.foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
#AttributeError: 'Test' object has no attribute '__bar'
test.__bar()
print(test.foo)
if __name__=="__main__":
main()
但是,python并没有从语法上严格保证私有属性或方法的私密性,它仅仅是给私有的属性或者方法换了一个名字来阻止你对他们的访问,如果知道更换名字规则的话,仍然可以对其进行访问,We are all consenting adults here,因为绝大多数程序员认为开放好于封闭。
class Test:
def __init__(self,foo):
self.__foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
#AttributeError: 'Test' object has no attribute '__bar'
test._Test__bar()
print(test._Test__foo)
if __name__=="__main__":
main()
输出:
hello
__bar
hello
实际开发过程中,并不建议将属性设置成为私有的,因为这会导致子类无法访问。
面向对象的三大支柱
没错,就是封装,继承,多态看看栗子自己体会体会就ok了,讲的话概念比较晦涩。
定义一个类描述数字时钟
from time import sleep
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 show(self):
#显示时间
return '%02d:%02d:%02d'%(self._hour,self._minute,self._second)
def main():
clock = Clock(23,59,58)
while True:
print(clock.show())
sleep(1)
clock.run()
if __name__=="__main__":
main()
定义一个类描述平面上的点并提供计算间距的方法
from math import sqrt
class Point(object):
def __init__(self,x=0,y=0):
self.x = x
self.y = y
def move_to(self,x,y):
self.x=x
self.y=y
def move_by(self,x,y):
self.x+=x
self.y+=y
def distance_to(self,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()
输出:
(3,5)
(0,0)
(-1,2)
5.0