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
@property的使用

 

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)


    
    
               
@classmethod的使用

 

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()
staticmethod的使用

 

posted @ 2018-04-16 15:36  木夂口  阅读(137)  评论(0编辑  收藏  举报
levels of contents