一、多态
二、封装
三、内置函数 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) # 小明 不用加()就能执行方法