多态
由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同
eg:多态:同一种事物的多种形态,动物分为人、猪、狗、猫等
class Animal(): #同一类事物:动物
def __init__(self,name,food):
self.name=name
self.food=fooddefeat(self):print("%s 正在吃 %s"%(self.name,self.food))class People(Animal): #动物形态1:人
defeat(self):print("人类吃的东西是%s"%self.food)class Dog(Animal): #动物形态2:狗
defeat(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:猪
defeat(self):print("猪吃的东西是%s"%self.food)
pig1= Pig('猪','猪食')
pig1.eat()
总结:
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。
多态性的本质在于不同的类中定义有相同的方法名,则可以在父类引入抽象类的概念来硬性限制子类必须有某些方法名
importabc#指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
def __init__(self,name,food):
self.name=name
self.food=food
@abc.abstractmethod#该装饰器限制子类必须定义有一个eat的方法
defeat(self):print("%s 正在吃 %s"%(self.name,self.food))
封装
封装指的是把数据与功能都整合到一起
第一层面:类本身就是一个封装
第二层面:类中定义私有的,只有在类的内部使用,外部无法访问
Python的class机制采用双下划线开头的方式将属性隐藏起来==》设置成私有的
类中所有双下划线开头的属性在类定义阶段,检测语法时自动变成 _类名_属性名的形式
classAnimal:
__N= 0#相等于 _Animal__N
num= 0_dannum= 1def __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: typeobject 'Animal' has no attribute '__N'print(Animal._dannum) #单下划线 可以访问
print(Animal._Animal__N) #可以访问
animal1= Animal('小猪','注释')
print(animal1.num)
#print(animal1.__N)AttributeError: typeobject 'Animal' has no attribute '__N'#animal1.__eyes()AttributeError:'Animal' object has no attribute '__eyes'
第三层面:明确区分内外,内部的实现逻辑,外部无法知晓,并且为封装到内部的逻辑提供一个访问接口给外部使用
classAnimal:__N = 0 #相等于 _Animal__N
num =0
_dannum= 1
def __init__(self,name,food):
self.name=name
self.food=food
self.__action ='哭'
defeat(self):print("%s 正在吃 %s"%(self.name,self.food))def __eyes(self): #_Animal__eyes
print("哈哈哈哈,我是__eyes")defeyestests(self):
self.__eyes()print(self.__action)
animal1= Animal('小猪','注释')
animal1.eyestests()