码迷,mamicode.com
首页 > 其他好文 > 详细

多态与封装

时间:2017-04-20 20:04:13      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:for   事物   ddr   str   student   video   section   white   text   

多态

多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。

比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印:

class Animal(object):
def run(self):
    print(‘Animal is running...‘)

当我们需要编写Dog和Cat类时,就可以直接从Animal类继承:

class Dog(Animal):
    pass

class Cat(Animal):
    pass

对于Dog来说,Animal就是它的父类,对于Animal来说,Dog就是它的子类。Cat和Dog类似。

继承有什么好处?最大的好处是子类获得了父类的全部功能。由于Animial实现了run()方法,因此,Dog和Cat作为它的子类,什么事也没干,就自动拥有了run()方法:

dog = Dog()
    dog.run()

cat = Cat()
    cat.run()

当子类和父类都存在相同的run()方法时,我们说,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()。这样,我们就获得了继承的另一个好处:多态。



多态性:一种调用方式,不同的类,定义统一的接口,不同的执行效果(多态性)

多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。

在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

多态性依赖于:

1,继承.

2,python的不限制类型

def func(obj): #obj这个参数没有类型限制,可以传入不同类型的值
obj.run() #调用的逻辑都一样,执行的结果却不一样

小结

继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。

封装

为什么要封装

封装数据的主要原因是:保护隐私

封装方法的主要原因是:隔离复杂度



在python中用双下划线的方式实现隐藏属性(设置成私有的)

class Student(object):

def __init__(self, name, score):
    self.__name = name
    self.__score = score

def print_score(self):
    print(‘%s: %s‘ % (self.__name, self.__score))

但是如果外部代码要获取name和score怎么办?可以给Student类增加getname和getscore这样的方法:

class Student(object):
...

def get_name(self):
    return self.__name

def get_score(self):
    return self.__score

如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:

class Student(object):
...

def set_score(self, score):
    self.__score = score

最后注意下面的这种错误写法:

bart = Student(‘Bart Simpson‘, 98)
bart.get_name()

bart.__name = ‘New Name‘ # 设置__name变量!
bart.__name

表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。

bart.get_name() # get_name()内部返回self.__name
‘Bart Simpson‘

多态与封装

标签:for   事物   ddr   str   student   video   section   white   text   

原文地址:http://www.cnblogs.com/kimyeee/p/6740132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!