初始面向对象
初始面向对象
我相信很多人都和我一样,提到面向对象的时候都不知道面向对象是什么,什么叫面向对象.其实面向对象不是什么深水猛兽,在我看来只是面向对象是专指在程序设计中采用封装,继承,多肽等设计方法,虽然这只是最初的理解,现在这种思想已经涉及到设计软件的各个方面.
今天我们就谈一下我对继承的理解
继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类.
1 class Animal: 2 ''' 3 人和狗都是动物,所以创造一个Animal基类 4 ''' 5 def __init__(self, name, aggressivity, life_value): 6 self.name = name # 人和狗都有自己的昵称; 7 self.aggressivity = aggressivity # 人和狗都有自己的攻击力; 8 self.life_value = life_value # 人和狗都有自己的生命值; 9 10 def eat(self): 11 print('%s is eating'%self.name) 12 13 class Dog(Animal): 14 pass 15 16 class Person(Animal): 17 pass 18 #这样人和狗都有了一样的属性:昵称,攻击力,生命值
这只是继承了Animal类的自身属性,如果是想继承其中的方法就要用到super().
1 class Animal: 2 def __init__(self,name,hp,ad): 3 self.name = name 4 self.hp = hp 5 self.ad = ad 6 class Person(Animal): 7 def __init__(self,name,sex,hp,mp,ad): 8 super().__init__(name,hp,ad) 9 self.sex = sex # 派生属性 10 self.mp = mp # 派生属性 11 12 def attack(self,dog): 13 print('%s攻击了%s'%(self.name,dog.name)) 14 dog.hp -= self.ad 15 16 class Dog(Animal): 17 def __init__(self,name,kind,hp,ad): 18 super().__init__(name,hp,ad) 19 self.kind = kind # 派生属性 20 21 def bite(self,person): 22 print('%s咬了%s'%(self.name,person.name)) 23 person.hp -= self.ad 24 25 alex = Person('阿泰','不详',10,10,0.1) 26 hei = Dog('家辉','中华田园犬',999,1.1) 27 print(hei.__dict__)
继承有两种用途:
一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)
二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
所以我我们可以借用abc模块来实现接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from abc import ABCMeta,abstractmethod 2 3 class Payment(metaclass=ABCMeta): 4 @abstractmethod 5 def pay(self,money): 6 pass 7 8 9 class Wechatpay(Payment): 10 def fuqian(self,money): 11 print('微信支付了%s元'%money) 12 13 p = Wechatpay() #不调就报错了
实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。
继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。
归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。