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)  # 小明 不用加()就能执行方法

猜你喜欢

转载自www.cnblogs.com/tian-tian/p/9556467.html