面向对象学习

一、面向对象三大特征

1、面向对象三大特征之封装

面向对象的程序设计中,某个类把所需要的数据(也可以说是类的属性)和对数据的操作(也可以说是类的行为)全部都封装在类中,分别称为类的成员变量和方法(或成员函数)。这种把成员变量和成员函数封装在一起的编程特性称为封装。

(1)公有成员变量和私有成员变量:Python中,以两个下划线‘__’开头的变量都是私有成员变量,而其余的变量都属于公有成员变量。私有的成员变量只能在类的内部访问,而共有的公有的成员变量可以在类的外部进行访问。

(2)公有方法和私有方法:公有的成员方法和私有的成员方法也是通过名字来区分的,双下划线‘__’开头的方法是私有成员方法。类的私有方法只能通过对象名(在类内部也就是self)在类的内部进行访问。而公有方法可以在类的外部通过对象名进行访问。

(3)创建对象后,Python解释器默认调用__init__()方法。当删除一个对象时,Python解释器也会默认调用一个方法,这个方法为__del__()方法。

def __del__(self):

1)python解释器执行完整个代码之后会默认最后调用对象的__del__()

2)如果有多个对象,有几个对象,python解释器执行完毕的时候就是调用几遍__del__()

3)如果手动删除时(del)删除完成就会执行__del__(),当使用del 把内存的所有应用删除,立刻调用__del__方法del xxx 不会主动调用__del__方法,只有引用计数==0时,__del__()才会被执行,并且定义了__del_()的实例无法被Python的循环垃圾收集器收集,所以尽量不要自定义__del__()。一般情况下,__del__() 不会破坏垃圾处理器。

2、面向对象三大特征之继承

子类在继承的时候,在定义类时,小括号()中为父类的名字父类的属性、方法,会被继承给子类私有属性(私有类属性)和私有方法不被继承。私有的属性,不能通过对象直接访问,但是可以通过方法访问私有的方法,不能通过对象直接访问私有的属性、方法,不会被子类继承,也不能被访问Python中是可以多继承的父类中的方法、属性,子类会继承.类名.__mro__方法的作用打印多重继承的继承方法顺序。

3、面向对象三大特征--多态

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)。

4、在Python中,以下划线开头的变量名有特殊的含义,尤其是在类的定义中。用下划线作为变量前缀和后缀来表示类的特殊成员:

(1) _xxx:这样的对象叫做保护变量,不能用'from module import *'导入,只有类对象和子类对象能访问这些变量;

(2)__xxx__:系统定义的特殊成员名字;

(3)__xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。Python中没有纯粹的C++意义上的私有成员。

二、设计一个三维向量类,并实现向量的加,减法以及向量与标量的乘法和除法

class Vecter3:
    def_init_(self,x=0,y=0,z=0):
              self.X=x
              self.Y=y
              self.Z=z
    def_add_(self,n):
              r=Vecter3()
              r.X=self.X+n.X
              r.Y=self.Y+n.Y
              r.Z=self.Z+n.Z
              return r
    def_sub_(self,n):
              r=Vecter3()
              r.X=self.X-n.X
              r.Y=self.Y-n.Y
              r.Z=self.Z-n.Z
              return r
    def_mul_(self,n):
              r=Vecter3()
              r.X=self.X*n
              r.Y=self.Y*n
              r.Z=self.Z*n
              return r
    def_truediv_(self,n):
              r=Vecter3()
              r.X=self.X/n
              r.Y=self.Y/n
              r.Z=self.Z/n
              return r
    def_floordiv_(self,n):
              r=Vecter3()
              r.X=self.X//n
              r.Y=self.Y//n
              r.Z=self.Z//n
              return r
    def show(self):
              print(self.X,self.Y,self.Z))

 

posted @ 2019-04-17 15:43    阅读(170)  评论(0编辑  收藏  举报