本文以GitHub上100天python从新手到大师为素材,规划为约100天的练习,每次的学习和总结均发在这里。有错误的地方还请朋友们指正。
什么是面向对象编程
根据我粗浅的理解,面向对象编程"把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。"
封装就是将一切实现的细节隐蔽起来,只给对方一个接口来使用。继承是指我们可以继承类的统一特性,但每个继承下来的新对象都不一样,会有自己的特性,这就是多态。
类和对象
类是对象们的统一,对象是类的具体化。 例如在动物中,狗是类的名字,而柯基、哈士奇就是狗类下的具体例子。当我们把柯基、哈士奇里四足、耳朵形状、叫声等特征行为概括起来时候,狗的类就建立起来了。
创建和使用对象
使用关键字 class 创建类,在里面可以通过属性赋值和函数来赋予类的内容。可以通过下面例子来说明:
其中 init 是特别的方法,用于初始化类的内容,并且我们通过self.name来获取了学生的名字,并以此类推。
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def study(self, course_name):
print("%sis studying%s" % (self.name, course_name))
def watch_movie(self):
if self.age < 18:
print("%s在看熊大" % self.name)
else:
print("%s在看成人才可以看的" % self.name)
在创建好类之后,我们就可以通过类来创建对象,并使用我们在类中存在的方法了。
stu1 = Student('王大锤', 15)
stu1.study('数学')
stu1.watch_movie()
访问可见性问题
在上面的例子中,对象的属性都是公开可访问到的,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()
# AttributeError: 'Test' object has no attribute '__foo'
print(test.__foo)
if __name__ == "__main__":
main()
但如果掌握了方法,私有的属性和方法我们也可以访问到,如下图:
class Test:
def __init__(self, foo):
self.__foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
test = Test('hello')
test._Test__bar()
print(test._Test__foo)
练习
练习1 创建一个电子时钟的类
TIPS: 电子时钟可以现实时间,可以走时间
class Digital_Clcok(object):
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
def run_time(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_time(self):
print("现在时间是:%s||%s||%s" %(self.hour, self.minute, self.second))
clock1 = Digital_Clcok(12,23,56)
clock1.show_time()
clock1.run_time()
练习2:给出一个直角坐标系内的点,可以显示坐标、移动坐标、计算与某一点的距离
from math import sqrt
class Point(object):
def __init__(self, x, y):
self.x = x
self.y = y
def location(self):
print("该点坐标为(%d,%d)" %(self.x, self.y))
def move_to(self, aim_x, aim_y):
self.x = aim_x
self.y = aim_y
print("转移至目标(%d,%d)" %(self.x, self.y))
def distance(self, target_x, target_y):
print("距离目标有%.2f" % sqrt((self.x - target_x) **2 + (self.y - target_y) **2))
point_1 = Point(1, 2)
point_1.location()
point_1.distance(4, 5)
point_1.move_to(4, 5)