多态和封装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多态和封装相关的知识,希望对你有一定的参考价值。

多态

>>> "This is a book".count("s")
2
>>> [1,2,4,3,5,3].count(3)
2

count()的作用是数一数某个元素在对象中出现的次数

>>> f = lambda x,y:x+y
>>> f(2,3)
5
>>> f("qiw","sir")
qiwsir
>>> f(["python","java"],["c++","lisp"])
[python, java, c++, lisp]

lambda函数中,我们没有限制参数的类型,也一定不能限制,因为如果限制了,就不是pythonic了。在使用的时候,可以给参数任意类型,都能到的不报错的结果。当然,这样做之所以合法,更多的是来自于+的功能强悍。

repr()函数,针对输入的任何对象返回一个字符串。

>>>    repr[1,2,3]
[1,2,3]
>>>    repr(1)
1
>>>    repr({"lang":"python"})
"{‘lang‘:‘python‘}"

 

#!/usr/bin/env python
# coding=utf-8

"the code is from: http://zetcode.com/lang/python/oop/"

__metaclass__ = type

class Animal:
    def __init__(self, name=""):
        self.name = name

    def talk(self):
        pass

class Cat(Animal):
    def talk(self):
        print "Meow!"

class Dog(Animal):
    def talk(self):
        print "Woof!"

a = Animal()
a.talk()

c = Cat("Missy")
c.talk()

d = Dog("Rocky")
d.talk()

代码中有Cat和Dog两个类,都继承了类Animal,它们都有talk()方法,输入不同的动物名称,会得出相应的结果。

 多态问题,最后还要告诫,类型检查是毁掉多态的利器,比如type、isinstance以及isubclass函数,所以,一定要慎用这些类型检查函数。

封装和私有化

python中私有化的方法也比较简单,就是在准备私有化的属性(包括方法、数据)名字前面加双下划线。

#!/usr/bin/env python
# coding=utf-8

__metaclass__ = type

class ProtectMe:
    def __init__(self):
        self.me = "qiwsir"
        self.__name = "kivi"

    def __python(self):
        print "I love Python."

    def code(self):
        print "Which language do you like?"
        self.__python()

if __name__ == "__main__":
    p = ProtectMe()
    print p.me
    print p.__name

用上面的方法,的确做到了封装。但是,我如果要调用那些私有属性,怎么办?

可以使用property函数

#!/usr/bin/env python
# coding=utf-8

__metaclass__ = type

class ProtectMe:
    def __init__(self):
        self.me = "qiwsir"
        self.__name = "kivi"

    @property
    def name(self):
        return self.__name

if __name__ == "__main__":
    p = ProtectMe()
    print p.name

用了@property之后,在调用那个方法的时候,用的是p.name的形式,就好像在调用一个属性一样,跟前面p.me的格式相同。

 

以上是关于多态和封装的主要内容,如果未能解决你的问题,请参考以下文章

Java基础知识回顾之三 ----- 封装继承和多态

Java基础知识回顾之三 ----- 封装继承和多态

C++的三大特性封装继承和多态

封装,继承,多态,接口

三大特性:封装,继承,多态

面向对象的三大特性:继承封装多态