标签:应用 它的 指定 ike 经典 interface iter rri 集合
部分参考来源:作者:JasonDing https://www.jianshu.com/p/650485b78d11##s1
首先介绍下面向对象(OOP)的三大特征:
(1)面向对象程序设计有三大特征:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。这三个单词很常见,大家还是记住为好!
(2)封装(Encapsulation):类包含了数据和方法,将数据和方法放在一个类中就构成了封装。
(3)继承(Inheritance):Java是单继承的(这点和C++有区别),意味着一个类只能继承于一个类,被继承的类叫父类(或者叫基类,base class),继承的类叫子类。Java中的继承使用关键字extends。但是,一个类可以实现多个接口,多个接口之间用逗号进行分割。实现接口使用关键字implements。
(4)多态(Polymorphism):多态最核心的思想就是,父类的引用可以指向子类的对象,或者接口类型的引用可以指向实现该接口的类的实例。多态之所以是这样的是因为基于一个事实:子类就是父类!
(5)关于多态的一些重要说明:
Duck typing 这个概念来源于美国印第安纳州的诗人詹姆斯·惠特科姆·莱利(James Whitcomb Riley,1849-
1916)的诗句:”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
先上代码,也是来源于网上很经典的案例:
1 class Duck(): 2 def walk(self): 3 print(‘I walk like a duck‘) 4 def swim(self): 5 print(‘i swim like a duck‘) 6 7 class Person(): 8 def walk(self): 9 print(‘this one walk like a duck‘) 10 def swim(self): 11 print(‘this man swim like a duck‘)
可以很明显的看出,Person
类拥有跟Duck
类一样的方法,当有一个函数调用Duck
类,并利用到了两个方法walk()
和swim()
。我们传入Person
类也一样可以运行,函数并不会检查对象的类型是不是Duck
,只要他拥有walk()
和swim()
方法,就可以正确的被调用。
再举例,如果一个对象实现了__getitem__
方法,那python的解释器就会把它当做一个collection
,就可以在这个对象上使用切片,获取子项等方法;如果一个对象实现了__iter__
和next
方法,python就会认为它是一个iterator
,就可以在这个对象上通过循环来获取各个子项。
python中的鸭子类型允许我们使用任何提供所需方法的对象,而不需要迫使它成为一个子类。
由于python属于动态语言,当你定义了一个基类和基类中的方法,并编写几个继承该基类的子类时,由于python在定义变量时不指定变量的类型,而是由解释器根据变量内容推断变量类型的(也就是说变量的类型取决于所关联的对象),这就使得python的多态不像是c++或java中那样,定义一个基类类型变量而隐藏了具体子类的细节。
请看下面的例子和说明:
1 class AudioFile: 2 def __init__(self, filename): 3 if not filename.endswith(self.ext): 4 raise Exception("Invalid file format") 5 self.filename = filename 6 7 class MP3File(AudioFile): 8 ext = "mp3" 9 def play(self): 10 print("Playing {} as mp3".format(self.filename)) 11 12 class WavFile(AudioFile): 13 ext = "wav" 14 def play(self): 15 print("Playing {} as wav".format(self.filename)) 16 17 class OggFile(AudioFile): 18 ext = "ogg" 19 def play(self): 20 print("Playing {} as ogg".format(self.filename)) 21 22 class FlacFile: 23 """ 24 Though FlacFile class doesn‘t inherit AudioFile class, 25 it also has the same interface as three subclass of AudioFile. 26 27 It is called duck typing. 28 """ 29 def __init__(self, filename): 30 if not filename.endswith(".flac"): 31 raise Exception("Invalid file format") 32 self.filename = filename 33 34 def play(self): 35 print("Playing {} as flac".format(self.filename))
MP3File
、WavFile
、OggFile
三个类型继承了AudioFile
这一基类,而FlacFile
没有扩展AudioFile
,但是可以在python中使用完全相同的接口与之交互。标签:应用 它的 指定 ike 经典 interface iter rri 集合
原文地址:https://www.cnblogs.com/guolei2570/p/8830934.html