一、课前内容回顾
继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类、接口)
继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中。
单继承:
重用性:减少代码的重复,子类可以复用父类的方法
派生:子类在父类的基础上又创建了自己的新的方法和属性
子类中有父类的同名方法:只用子类的
还希望用到父类中的方法:父类名(self,...)、super(...)调用
抽象类:只能被继承,不能被实例化 模板、规则
抽象类的模板:
from abc import ABCMeta,abstractclassmethod # 从模块中导入类,函数 class A(metaclass=ABCMeta): # 元类 @abstractmethod # 装饰器 def func(self):pass
多继承 python/c++
java/c#没有
每个类中有每个类能完成的方法
创建子类的时候只需要挑选和我相符的父类来继承就能够完成父类的功能了
接口:java中的一种数据类型
经典类和新式类的区别
#经典类:不主动继承object、没有mro方法、没有super、遵循深度优先
#新式类:主动继承object、有mro方法、有super、遵循广度优先
二、多态
什么是多态?
一个类表现出的多种状态,:通过继承来实现
在java中的表现:在一个函数中需要给参数指定数据类型,如果这个地方可以接收两个以上类型的参数,那么这个类型应该有一个父类,这个父类是所有子类对象的类型
在Python中:函数的参数不需要指定数据类型,所以我们不需要通过继承的形式来统一一组类的类型,换句话说,所有的对象其实都是object类型,所以在Python当中其实处处是多态。
def fun(a):
a既可以传猫也可以传狗类,随便传任意类型
鸭子类型
def len(obj)
len() # str list tuple dict set rang(3)
print() # 所有的对象都是鸭子类型
特点:不是明确的通过继承实现的多态
而是通过一个模糊的概念来判断这个函数能不能接收这个类型的参数。
三、封装
广义的封装 :把属性和方法放到类里
class 类名:
def 方法1(self):pass
作用:是为了只有这个类的对象才能使用定义在类中的方法
狭义的封装 :定义私有成员
class A:
__a = 10
# print(__a) # 类里面直接调用
def func(self):
print(A.__a)
aa = A()
aa.func()
print(aa._A__a) # 外面调用使用_类名__私有属性
特点:
在类的外部不能引用私有的静态变量
类中的静态变量和方法名在程序加载的过程中就执行完了,不需要等待调用
在这个类加载完成之前,Goods这个名字还没有出现在内存空间中
私有的静态属性可以在类的内部使用,用来隐藏某个变量的值
编程规范的角度上出发,我们不能在类的外部使用私有的变量
类中的私有成员
私有的静态属性
私有的对象属性
私有的方法
把一个名字藏在类中
class Student: def __init__(self,name): self.__name = name def name(self): return self.__name zhuge = Student('诸葛') # 查看对象中的私有属性 print(zhuge.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',5000) print(apple.price())
实例应用
class User: def __init__(self,username,password): self.usr = username self.__pwd = password self.pwd = self.__getpwd() def __getpwd(self): return hash(self.__pwd) obj = User('alex','alex3714') print(obj.usr,obj.pwd) # alex 5616937197111795784
私有制的作用:
不让看
不让改
修改有限制
有些方法或者属性不想被子类继承
四、property的用法
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)