python3基础-多态、封装

多态

由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同

eg:多态:同一种事物的多种形态,动物分为人、猪、狗、猫等

class Animal(): #同一类事物:动物
    def __init__(self,name,food):
        self.name = name
        self.food = food
    def eat(self):
        print("%s 正在吃 %s"%(self.name,self.food))


class People(Animal):    #动物形态1:人
    def eat(self):
        print("人类吃的东西是%s"%self.food)


class Dog(Animal):        #动物形态2:狗
    def eat(self):
        print("狗吃的东西是%s"%self.food)

#实例化得到两个对象
people1 =People('人类-苏','牛排')
dog1 = Dog('狗-小黑','狗粮')

#多态性指的是可以不用考虑对象具体类型的情况下而直接使用对象
people1.eat()
dog1.eat()

#多态性指的是可以不用考虑对象具体类型的情况下而直接使用对象
people1.eat()
dog1.eat()

#多态性:一种调用方式,不同的执行结果(多态性)
# 定义统一的接口
def eat(animal): #animal 没有类型限制,可以传入不同类型的值
animal.eat() #调用逻辑一样,执行的结果却不一样
print("-----------")
eat(people1)
eat(dog1)

多态性的好处在于增强了程序的灵活性和可扩展性,例如通过继承了Animal类创建了一个新的类,实例化得到的对象obj,可以使用相同的方式使用obj.eat()

class Pig(Animal):        #动物形态3:猪
    def eat(self):
        print("猪吃的东西是%s"%self.food)
pig1 = Pig('','猪食')
pig1.eat()

总结:

   多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。

   多态性的本质在于不同的类中定义有相同的方法名,则可以在父类引入抽象类的概念来硬性限制子类必须有某些方法名

import abc
#指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    def __init__(self,name,food):
        self.name = name
        self.food = food
        
    @abc.abstractmethod  #该装饰器限制子类必须定义有一个eat的方法
    def eat(self):
        print("%s 正在吃 %s"%(self.name,self.food))

封装

封装指的是把数据与功能都整合到一起

第一层面:类本身就是一个封装

第二层面:类中定义私有的,只有在类的内部使用,外部无法访问

Python的class机制采用双下划线开头的方式将属性隐藏起来==》设置成私有的

类中所有双下划线开头的属性在类定义阶段,检测语法时自动变成 _类名_属性名的形式

class Animal:
    __N = 0 #相等于 _Animal__N
    num = 0
    _dannum = 1
    def __init__(self,name,food):
        self.name = name
        self.food = food
        self.__action =''

    def eat(self):
        print("%s 正在吃 %s"%(self.name,self.food))

    def __eyes(self): # _Animal__eyes
        print("__eyes")

print(Animal.num)
# print(Animal.__N)  AttributeError: type object 'Animal' has no attribute '__N'
print(Animal._dannum) #单下划线 可以访问
print(Animal._Animal__N) #可以访问 
animal1 = Animal('小猪','注释')
print(animal1.num)
#print(animal1.__N)AttributeError: type object 'Animal' has no attribute '__N'
#animal1.__eyes()AttributeError: 'Animal' object has no attribute '__eyes'

第三层面:明确区分内外,内部的实现逻辑,外部无法知晓,并且为封装到内部的逻辑提供一个访问接口给外部使用

 

class Animal:
    __N = 0 #相等于 _Animal__N
    num = 0
    _dannum = 1
    def __init__(self,name,food):
        self.name = name
        self.food = food
        self.__action =''

    def eat(self):
        print("%s 正在吃 %s"%(self.name,self.food))

    def __eyes(self): # _Animal__eyes
        print("哈哈哈哈,我是__eyes")

    def eyestests(self):
        self.__eyes()
        print(self.__action)

animal1 = Animal('小猪','注释')
animal1.eyestests()

 

 

 

 

 

 

 

posted @ 2019-11-07 09:36  槑槑DE  阅读(142)  评论(0编辑  收藏  举报