zoukankan      html  css  js  c++  java
  • Python学习笔记-Day19-多态、封装

    一、多态

    二、封装

    三、内置函数 property

    一、多态

    1、什么是多态?

    一个类通过继承表现数多种状态

    2、python中不用多态,为什么要把多态单独列出来?(从java来讨论,为了和其他语言一致,类的三种特性就是继承,多态,封装)

    java中运用多态来解决函数传参时的数据类型的规范问题

    java:在一个函数中需要给参数指定数据类型,如果这个地方要接收两种类型以上的参数,那么这些类型应该要有一个父类,这个父类就是所有参数的类型

    3、多态在python中的应用

    python中的函数不需要指定数据类型,所以不需要通过继承的方式统一一组类的类型,但实际上,python3中所有的类都继承了object,所以python中处处是多态

    4、不是明确的通过继承实现的多态,而是通过一个模糊的概念来判断函数能不能接收这个参数

    len():函数能接收的数据类型有str、list、tuple、set、dict、range(3),这些就是鸭子类型

    二、封装

    1、广义的封装:把属性函数都放到类里,只有这个类的对象才能使用类里的方法

    2、狭义的封装:定义私有成员

    class Goods:
        __discount = 0  #
        print(__discount)
    # 程序执行到这就能打印 0
    # print(Goods.__discount)  # 不能打印,__dicount被定义为私有成员
    print(Goods.__dict__)  #   __discount在类中的名字是  _Goods__discount

    以上代码知识点:

      ① 类中的静态变量和方法名在类加载的时候就已经执行完了,不需要等待调用

      ② 在这个类加载完成之前,Goods这么名字还没出现在内存空间,所以类中可以使用类名

      ③ 私有的静态变量可以在类中使用,用来隐藏变量的值

    类中的私有成员:

      私有的静态属性

      私有的对象属性

      私有的方法

    为什么要定义私有变量?

      不想让你看到这个值

      不想让你修改这个值

      让你修改这个值的时候有一些限制

      不想让子类继承某些方法和属性

    例一:
    class Student:
        def __init__(self,name,age):
            self.__name = name
            self.age = age
        def name(self):  # 让对象通过函数取变量的值,但是无法对变量进行更改
            return self.__name
    ming = Student('小明',20)
    print(ming.name())   #小明
    
    例二:
    class Goods:
        __discount = 0.7
        def __init__(self,name,price):
            self.name = name
            self.__price = price
        def price(self):
            return self.__price * Goods.__discount   # 返回修改后的价格
    apple = Goods('apple',10)
    print(apple.price())   # 7.0
    
    例三:
    class User:
        def __init__(self,name,pwd):
            self.name = name
            self.__pwd = pwd
            self.pwd = self.get_pwd()
        def get_pwd(self):
            return hash(self.__pwd)  # 给密码加密
    ming = User('ming','ming123')
    print(ming.pwd)  #-3599564026323875206

    私有变量不能在类外部被定义:只能定义出一个名字叫__啥的普通属性,不是私有成员

    class A:
        __country = 'China'
    print(A.__dict__)   #'_A__country': 'China'
    A.__language = 'English'
    print(A.__dict__)   # '__language': 'English'

    私有变量不能被继承,因为子类在调用时,对象名字变为 _子类名__变量名,永远找不到父类中的 _父类名__变量名

    class A:
        __country = 'China'
        def __init__(self,name):
            self.__name = name
    class B(A):
        print(__country)   #程序报错,因为找不到  '_B__country'
        def get_name(self):
            return self.__name  #程序报错,函数无法执行,AttributeError: 'B' object has no attribute '_B__name'
    b = B('ming')
    b.get_name()

    三、内置函数property

    property是一个装饰器函数,可以将一个方法伪装成属性,调用的时候可以不用加()

    装饰器的使用:在要装饰的函数、方法、类上面一行加上 @装饰器名字

    装饰器的分类:

      装饰函数

      装饰方法:property

      装饰类

    用法:

    class Student:
        def __init__(self,name,age):
            self.__name = name
            self.age = age
        @property
        def name(self):
            return self.__name
    ming = Student('小明',20)
    print(ming.name)  # 小明 不用加()就能执行方法
  • 相关阅读:
    推荐一个SAM文件中flag含义解释工具--转载
    字节码技术
    Jconsole工具检测堆内存变化的使用
    观察者模式
    装饰器模式(IO流案例)
    JVM垃圾收集器
    内存溢出与内存泄漏区别
    栈溢出
    内存溢出
    JVM参数调优
  • 原文地址:https://www.cnblogs.com/tian-tian/p/9556467.html
Copyright © 2011-2022 走看看