python之路--day22--多态....property..calssmethod....staticmethod
1,什么是多态
多态指的是同一种事物多种形态
2,为什么要用多态
用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现---就是继承),这样便可以在
不用考虑对象具体类型的前提下而直接使用对象下的办法
3,如何使用多态
使用 import abc ##abstract class ----抽象类来实现多态
import abc class Aniaml: @abc.abstractclassmethod #强制要求子类必须有同名属性 def talk(self): pass class People(Aniaml): def talk(self): print('hahahaha') class Cat(Aniaml): def talk(self): print('miaomiaomiao') class Dog(Aniaml): def talk(self): print('wangwangwang')
需要注意的是:使用 abc方法抽象基类后,基类就不能实例化,否则报错
多态性:就是在不考虑对象的具体类型的情况下,直接使用对象下的方法
理解:在使用的多态的前提下,那么不同的对象下都有一个或多个同名的方法,
那么调用者发生同样的一条指令,不同的对象就会根据这条同样的指令,返回不同的结果
多态性的好处:
1,增强程序的灵活性
2,增加程序的可扩展性
鸭子类型:python崇尚简洁自由,鸭子类型就是在多态表现为:看起来是多态,但没有使用 abstract class(抽象类)来强制规定为多态,
所以鸭子类型就是 ‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’---看起来想什么,那么就是什么
保持了程序的松耦合度
封装之property:本质是装饰器,在函数头部单独一行,@property
就是把类的一个函数属性伪装成数据属性。
class People: def __init__(self,name): self.__name =name #封装属性,不让外部直接访问 @property def name(self): #obj.name 伪装之后,无法直接修改 print('你现在访问的是用户名。。。') return self.__name @name.setter def name(self,x): #obj.name = x 使用property的setter方法实现修改 self.__name = x @name.deleter def name(self): del self.__name
classmethod
当类内部函数不需要给对象使用,你需要自动传入self,而且该函数需要给class使用,那么可以使用classmethod来实现自动传入类名
import setting class People def __init__ (self,name,age): self.name =name self.age =age def tell(self): print('%s:%s' %(self.name,self.age)) @classmethod def from_conf(cls): return cls(setting.NAME,setting.AGE)
staticmethod: 将类的函数属性,装饰为普通函数
特征:既不和类绑定,也不和对象绑定,就是说谁来用都是一个普通函数,没有了自动传值的特性
import settings import hashlib import time class People: def __init__(self,name,age): self.uid=self.create_id() self.name=name self.age=age def tell(self): print('%s: %s:%s' %(self.uid,self.name,self.age)) @classmethod def from_conf(cls): return cls(settings.NAME,settings.AGE) @staticmethod def create_id(): m=hashlib.md5() m.update(str(time.clock()).encode('utf-8')) return m.hexdigest()