zoukankan      html  css  js  c++  java
  • 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

        

  • 相关阅读:
    内部共享上网
    Harbor部署
    一、Gitlab安装
    Dockerfile
    DockerCompose
    二、Git
    nginx域名代理
    三、jenkins持续集成工具安装
    chrome对于“submit”关键字的保留
    insightface 提取人脸特征(超简洁)
  • 原文地址:https://www.cnblogs.com/echo-up/p/9557051.html
Copyright © 2011-2022 走看看