python自动化学习笔记之DAY8

一、面向对象的其他用法

1、接口与归一化设计

首先,先把类共同的函数提取一个接口,然后让子类去实现接口中的函数。最后归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。

归一化的好处在于:

1. 归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。

2. 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合

例:模仿interface

class Interface:#定义接口Interface类来模仿接口的概念,python中压根就没有interface关键字来定义一个接口。
def read(self): #定接口函数read
pass

def write(self): #定义接口函数write
pass


class Txt(Interface): #文本,具体实现read和write
def read(self):
print('文本数据的读取方法')

def write(self):
print('文本数据的写方法')

class Sata(Interface): #磁盘,具体实现read和write
def du(self):
print('硬盘数据的读取方法')

def write(self):
print('硬盘数据的写方法')

 

2、抽象类

抽象类是一个特殊的类,他只能被继承,不能被实例化。

如果说类是从一堆对象中抽取相同内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性

import abc
class Interface(metaclass=abc.ABCMeta):#定义接口Interface类来模仿接口的概念,python中压根就没有interface关键字来定义一个接口。
    all_type='file'
    @abc.abstractmethod
    def read(self): #定接口函数read
        pass

    @abc.abstractmethod
    def write(self): #定义接口函数write
        pass


class Txt(Interface): #文本,具体实现read和write
    def read(self):
        pass

    def write(self):
        pass
t=Txt()

print(t.all_type)

 

3、多态

多态:同一种事物的多种形态

import abc

class Animal(metaclass=abc.ABCMeta): #同一类事物:动物

 @abc.abstractmethod
    def talk(self):
        pass

class People(Animal): #动物的形态之一:人
    def talk(self):
        print('say hello')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

多态性:可以在不考虑实例类型的前提下使用实例

p1=People()
d=Dog()

p1.talk()
d.talk()

多态增加了程序的灵活性跟可扩展性

 

4、封装

①、隐藏

class Foo:

  __N=111                          #在变量或者函数之前有两个——的,作为隐藏,隐藏之后的变量或者函数只能在内部使用,外部无法调用

  def _init_(self,name):

    self.__Name=name

  def __f1(self):

    print('f1')

  def f2(self):

    self.__f1()

f=Foo('coco')

f.__N  #报错

f.__f1()  #报错

f.f2()  #可以正常访问

这种隐藏只是一种语法上的变形操作,并不是真正隐藏起来

print(f._Foo.__N)       #这种也可以正常访问

这种语法级别的变形,是在定义阶段发生的,并且只在定义阶段发生

 Foo.__x=123123

在子类中定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

封装不是单纯意义的隐藏
①:封装数据属性:将属性隐藏起来,然后对外提供访问属性的接口,关键是我们在接口内定制一些控制逻辑从而严格控制使用对数据属性的使用

②:封装函数属性:为了隔离复杂度

例:

取款是功能,而这个功能有很多功能组成:插卡、密码认证、输入金额、打印账单、取钱
对使用者来说,只需要知道取款这个功能即可,其余功能我们都可以隐藏起来,很明显这么做
隔离了复杂度,同时也提升了安全性

class ATM:
    def __card(self):
        print('插卡')
    def __auth(self):
        print('用户认证')
    def __input(self):
        print('输入取款金额')
    def __print_bill(self):
        print('打印账单')
    def __take_money(self):
        print('取款')

    def withdraw(self):
        self.__card()
        self.__auth()
        self.__input()
        self.__print_bill()
        self.__take_money()

a=ATM()
a.withdraw()

posted @ 2017-08-25 10:31  糖果的海角sky  阅读(112)  评论(0)    收藏  举报