zoukankan      html  css  js  c++  java
  • 面向对象 三大特性--多态

    多态

    多态指的是一类事物有多种形态

     python 天生支持多态

    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')
    
    class Pig(Animal): #动物的形态之三:猪
        def talk(self):
            print('say aoao')

    多态性

    peo=People()
    dog=Dog()
    pig=Pig()
    
    #peo、dog、pig都是动物,只要是动物肯定有talk方法
    #于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
    peo.talk()
    dog.talk()
    pig.talk()
    
    #更进一步,我们可以定义一个统一的接口来使用
    def func(obj):
        obj.talk()

    鸭子类型

    不崇尚根据继承所得来的相似
    只是自己实现自己的代码就可以了
    如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
    list tuple这种相似,是自己写代码的约束的,而不是通过父类约束的
    优点:松耦合
    缺点:太随意了,只能靠自觉

    class List():
        def __len__(self):pass
    class Tuple():
        def __len__(self):pass
    
    def len(obj):
        return obj.__len__()
    
    l = Tuple()
    len(l)

    封装

    广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
    只让自己的对象能调用自己类中的方法

    狭义上的封装 —— 面向对象的三大特性之一
    属性 和 方法都藏起来 不让你看见
    class Person:
        __key = 123  # 私有静态属性
        def __init__(self,name,passwd):
            self.name = name
            self.__passwd = passwd   # 私有属性
    
        def __get_pwd(self):         # 私有方法
            return self.__passwd   #只要在类的内部使用私有属性,就会自动的带上_类名
    
        def login(self):          # 正常的方法调用私有的方法
            self.__get_pwd()
    
    alex = Person('alex','alex3714')
    print(alex._Person__passwd)   # _类名__属性名
    print(alex.get_pwd())
    '''
    所有的私有 都是在变量的左边加上双下划綫
        对象的私有属性
        类中的私有方法
        类中的静态私有属性
    所有的私有的 都不能在类的外部使用
    '''

    好处 :

    1. 将变化隔离; 

    2. 便于使用;

    3. 提高复用性; 

    4. 提高安全性;

    封装原则:

          1. 将不需要对外提供的内容都隐藏起来;

          2. 把属性都隐藏,提供公共方法对其访问。

  • 相关阅读:
    处理不同方向的文本1.0
    CSS盒模型
    费德曼学习法
    [转]Photoshop中的高斯模糊、高反差保留和Halcon中的rft频域分析研究
    [转]仿射变换及其变换矩阵的理解
    [转]Scintilla开源库使用指南(一
    [转]Scintilla开源库使用指南(二
    [转]C#中WinForm窗体事件的执行次序
    [转]透过IL看C#:switch语句(转)
    [转]程序员必读书单(转)
  • 原文地址:https://www.cnblogs.com/soleZ/p/8311309.html
Copyright © 2011-2022 走看看