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()