http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2019-4-5 11:29:00
博文:python的面向对象(二)


  先补充一下关于私有属性和私有方法的问题,前述在类的外部是不能直接访问私有属性和私有方法的(有不推荐的特殊方法),但如果有需要的话,可以定义一个方法,在该方法里去调用私有属性和私有方法(这是允许的),从而在外间接使用了私有属性和私有方法。

   今天继续小结面向对象的特点:封装、继承和多态

   1、封装,如同函数一样,函数将代码封装在内,方便反复调用(只要调用函数就调用这些代码),而对象也是这个道理,将对象的属性和方法封装在一个类中,创建到对象就有了相关的属性和方法。

  2、继承,子类可以继承父类的所有属性和方法,如class A:,class BA),B类为A类的子类,B类继承A类的所有属性和方法,不过子类不能直接访问父类的私有属性和方法。

   继承还分单继承和多继承,所谓多继承,即一个类可以继承多个父类(一个儿子可以有多个父亲),子类继承所有父类的所有属性和方法,这里有个问题,如果多个父类中有同名的属性和方法时,子类继承的属性和方法与写法有关,这个叫MRO(属性方法的检索)问题,有专门的函数可以查询,所谓写法如class C(A,B)和class C(B,A),即子类C继承父类A,BC类继承父类B,A是不一样的。 

  有继承就有重写的问题,所谓重写,即如果父类提供的方法不能满足子类的需要,子类可以重写父类的这个方法,重写方法可以是完全重写(完全与父类方法不同了),还可以是在父类方法的基础上增加点新东西。

  重写方法,首先,子类的方法名要与父类的方法名相同,只是在子类中重写一遍,如果要在父类方法上添加新东西,也是一样用父类方法名,在方法内先用supper().方法名,先继承父类的方法(或称调用父类的方法),再写新代码即可。

   3、多态,学js的时候,js号称不支持多态,但可以模拟多态,记得举的例子是,一个函数,当传入不同的参数时执行不同的代码,其实就是通过判断参数来执行不同的代码,在js对象里反而没怎么提了(这也许是我理解不到位)。

  py的面向对象提多态,我理解的本意是,一个方法调用不同的对象时,执行不同的代码,实现的原理是基于继承和重写的,这里要谈两个东西。一个是对象作为参数传入到方法里,在方法里可以调用该对象的方法和属性;二是子类继承了父类的方法,但子类的方法可以重写,想象一下,父类和子类有同名的方法,但是因为重写,同名的方法其实代码不同(执行的结果也就不同),然后在另一个类中调用该对象(在另一个类创建的对象中传入前面父子类创建的对象),因为父子的方法同名不同性,结果当然不同,这大概是多态的意思。

   关于多态,自己看了一遍自己写的,有点表述不清,举个例子说明下,比如定义一个父类(狗)class Dog,里面有个方法bark()犬叫,输出一个“汪汪汪”,用这个Dog类定义一个子类(哮天犬)class XiaoTianQuan(Dog),哮天犬当然继承父类Dogbark()方法,现在重写哮天犬的bark()方法,输出“哮天犬会说人话”,这时用Dog类创建一个实例对象(旺财)wc,再用XiaoTianQuan类创建一个实例对象(二郎神的狗)xtq,这时wcxtq虽然都有bark方法,但实际代码已经不同了,这时如果另外有个类,比如(人的类)class Person,这个人的类里定义一个方法要传入一个狗对象(可以是wc,也可以是xtq,当然也可以是父子狗类实例出来的其他狗),并且方法里要调用对象的bark方法,这时传入的是wc与传入的是xtq,执行的结果就不一样了,这就是多态,即传入不同的对象,同一个方法结果不同!

  这就是我理解的封装、继承和多态,在面向对象里个人觉得这属于比较容易理解的部分,倒是本篇开始所述的私有属性和方法的应用场景现在理解不深。

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.