面向对象-三大特性

python面向对象编程三大特性

小结:前面我们说完了类和对象的关系,相信对类和对象的理解更加透彻..让我们一起去研究面向对象的三大特性吧....

继承

1.什么继承?

在程序中继承就是事物之间的所属关系.

2.继承的语法: 单继承 和多继承

#单继承
class A:pass
class B(A):pass  #B类继承了A类  A为父类,B为子类
print(B.__bases__)  #  __bases__  查看所有继承的父类

#多继承
class C:pass
class D:pass
class E(C,D):pass   # E类继承了C,D两个类,其中C,D 都是父类,E类是子类

A类 : 父类,也称基类/超类.
B类:子类,也成派生类

3.父类和子类的关系

       1. 子类可以继承父类的方法和属性

常规继承
class
Animal: def __init__(self,name,kind,languge): self.name = name self.kind = kind self.languge = languge def eat(self): print('%s is eattint'%(self.name)) def drink(self): print('%s is drinking'%self.name) def yell(self): print('%s say %s'%(self.name,self.languge)) class Cat(Animal):pass class Dog(Animal):pass small_cat =Cat('small_cat','persian','mews') small_dog =Dog('small_dog','Huskil','yap') small_cat.yell() #Cat类没有__init__方法,继承父类中的属性和方法,在Animal类找到init方法进行执行. small_dog.drink() print(small_dog.name)

分析实例化执行流程: 以Cat类为例
1.首先先开辟一块内存空间,并且内存空间有一个类指针,指向Cat,
2.然后执行init方法,在Cat中并没有init方法,于是找Animal父类中init方法
3.将空间返回给small_cat

      2.如果子类也中拥有自己的属性怎么继承呢?

class Animal:
    def __init__(self,name,kind,language):
        self.name = name
        self.kind = kind
        self.language = language
    def yell(self):
        print('%s say %s'%(self.name,self.language))
class Cat(Animal):   #子类中拥有自己的方法
    def climb(self):      # 派生方法
        print('%s can climb'%self.name)
class Dog(Animal):        # 派生方法
    def lookafter_door(self):
        print('%s can look after door'%self.name)
small_cat =Cat('small_cat','persian','mews')
small_dog =Dog('small_dog','Huskil','yap')

small_cat.climb()  #自己有方法用自己
small_dog.lookafter_door()  #同理

animal_1 = Animal('大金鱼','','吐泡泡')
animal_1.climb()   # 父类调用子类的方法直接报错

从中分析子类调用方法:1.子类有自己的方法就用自己,用了自己的就不可以用父类的
2.子类中没有方法直接用父类的
           3.子类有个性化方法,单独定义在子类中 -->派生方法
           4.子类可以调用父类,父类不能调用子类.


     3.子类和父类的方法相同又都想用怎么办?

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

    def sleep(self):
        print('%s 在睡觉'%self.name,)
class Cat(Animal):
    def climb(self):      # 派生方法
        print('%s can climb'%self.name)
    def sleep(self):
        Animal.sleep(self)    # 父类名,主动传self  实现调用父类同名方法
        #super().sleep()     当然这种 super(self,Cat).方法名() 也可以
        print('团着睡')
small_cat =Cat('small_cat','persian','mews')
small_cat.sleep()   
 #如果需要既执行父类方法sleep,又要执行Cat类自己方法.达到特定的效果.就需要调用父类了

 总结:当某一个方法,父类和子类都拥有的时候,那么在子类的方法中,调用父类的同名方法     1.父类名.方法名(self,...)     2.super().方法名(...)

4.为什么有继承?

    几个类之间有重复的属性和方法,把相同的属性和方法都抽象出来,作为父类,子类取继承父类. 为了解决类与类之间代码重复的问题.

          请看看示例代码:

#动物类
class Animal:
    def __init__(self,name,hp,ad):
        self.name = name
        self.hp = hp
        self.ad = ad
class People(Animal):
    def __init__(self, name, sex, hp, ad):
        super().__init__(name,hp,ad)
        self.sex = sex
    def attack(self,giant):
        print('%s发起了攻击了%s'%(self.name,giant.name))
        giant.hp -= Sheldon.ad
        print('%s的HP剩余%s' % (giant.name, giant.hp)) #
#怪兽类
class Monster(Animal):
    def __init__(self,name,kind,hp,ad):
        super().__init__(name,hp,ad)
        self.kind = kind
    def bite(self,Sheldon):
        print('%s撕咬了%s'%(self.name,Sheldon.name))
        Sheldon.hp -= giant.ad
        print('%s的HP剩余%s'%(Sheldon.name,Sheldon.hp))
giant = Monster('giant','big',100,20)
Sheldon = People('sheldon','male',100,10)

Sheldon.attack(giant)
giant.bite(Sheldon)

.....

猜你喜欢

转载自www.cnblogs.com/CrazySheldon1/p/9992949.html