• python_面向对象-多态封装


    一、多态

      什么是多态?

        一个类表现出多种形态:通过继承实现

          1、 Java中运用多态来解决传参的时候,数据类型的规范问题

            在Java中的表现:在一个函数中需要给参数指定数据类型,如果这个地方可以接收两个以上的类型参数

            那么这些类型应该有个父类,这个父类是所有子类对象的类型

          2、 在python中函数的参数不需要指定数据类型,所以我们也不需通过继承的形式来统一一组类的类型

            换句话说所有的对象都是object类型,所以在python中处处是多态

    from abc import ABCMeta,abstractmethod
    class Anmial(metaclass=ABCMeta):
        def __init__(self,name):
            self.name = name
    
        @abstractmethod
        def eat(self):pass
    
    class Dog(Anmial):
    
        def eat(self):
            print('%s狗粮' %(self.name))
    
    class Cat(Anmial):
    
        def eat(self):
            print('%s狗粮' % (self.name))
    
    d = Dog('小黑狗')
    c = Cat('小花猫')
    
    d.eat()
    c.eat()
    View Code

      鸭子类型?

        不是明确的通过继承实现的多态

        而是通过模糊的概念来判断这个函数能不能接收这个类型的参数 

    二、封装

      广义的封装

        class A:

          def f(self):pass

        是为了只有这个类的对象才能调用定义在类中的方法

      狭义上的封装

        class Foo:

          __count = 0  #私有的静态属性

          def __f(self):pass  #私有的静态方法

        print(Foo.__count)    #报错

        在类的外部不能引用私有的静态变量

        类中的变量和方法,在程序加载过程中就已经执行完了,不需要等待调用

        在这个类加载完成之前,Foo这个名字还没有出现在内存中

        私有的静态属性可以在类的内部使用,用来隐藏某个变量  

    class Goods:
        __discount = 0.7
    
        def __init__(self,name,price):
            self.name = name
            self.__price = price
    
        def price(self):
            return self.__price * self.__discount
    
        def changePrice(self,new_price):
            if type(new_price) is int:
                self.__price = new_price
            else:
                print('价格修改不成功')
    
    g = Goods('apple',5)
    print(g.price())
    g.changePrice('aaa')
    print(g.price())
    g.changePrice(10)
    print(g.price())
    View Code

       类中的私有成员

        私有静态属性

        私有对象属性

        私有静态方法

      为什么定义私有变量?

        我不想让你看到这个值

        我不想让你修改这个值

        我想让你修改这个值的时候受到限制,保证数据的安全性

        有些属性和方法不希望被子类继承

    三、内置函数补充

      1、property是一个装饰器函数,将一个方法伪装成属性

    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        @property
        def area(self):
            return self.r ** 2 * pi
        @property
        def perimeter(self):
            return 2 * self.r * pi
    
    c1 = Circle(10)
    print(c1.area)
    print(c1.perimeter)
    c1.r = 5
    print(c1.area)
    print(c1.perimeter)
    View Code

        

  • 相关阅读:
    Remote Debugging (2)
    Remote Debugging (3)
    在面试中常见额智力测试
    异常处理和约束
    方法&函数区别,反射
    类与类之间的关系
    成员
    初识面向对象
    一些令你""呵呵''的题目
    内置函数二 & 递归 & 二分查找
  • 原文地址:https://www.cnblogs.com/echo-up/p/9557051.html
Copyright © 2020-2023  润新知