多态和封装
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
的格式相同。
以上是关于多态和封装的主要内容,如果未能解决你的问题,请参考以下文章