继承:什么是什么关系
组合:什么有什么关系
单继承
先抽象再继承,几个类直接的相同代码抽象出来,成为父类
子类自己没有的名字可以使用父类的方法和属性
如果子类自己有,一定先用自己的
在类中使用self的时候,一定要看清楚self指向谁
多继承
新式类和经典类:
关于多继承寻找名字的顺序:新式类广度优先,经典类深度优先
在新式类里,有个类名,mro方法,查看广度优先的继承顺序
在python方法,有个super方法,根据广度优先的继承顺序查找上一个类
from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): #元类 默认的元类 type @abstractmethod def pay(self,money): raise NotImplemented #没有实现这个方法 # 规范:接口类或者抽象类都可以 #接口类 默认支持多继承,接口类中的所有的方法都必须不能实现——java #抽象类 不支持多继承,抽象类中的方法可以实现一些代码的实现——java class Wechat(Payment): def pay(self,money): print('已经使用微信支付了%s元'%money) class Alipay(Payment): def pay(self,money): print('已经使用支付宝支付了%s元'%money) class Applepay(Payment): def fuqian(self,money): print('已经使用applepay支付了%s元'%money) def pay(pay_obj,money): #统一支付入口 pay_obj.pay(money) # wechat = Wechat() # wechat.pay(100) # ali = Alipay() app = Applepay() # ali.pay(200) # pay(wechat,200) # pay(ali,200) # pay(app,300)
接口类的多继承
from abc import abstractmethod,ABCMeta class Swim_Animal(metaclass=ABCMeta): @abstractmethod def swim(self): pass @abstractmethod def func1(self): pass class Walk_Animal(metaclass=ABCMeta): @abstractmethod def walk(self): pass class Fly_Animal(metaclass=ABCMeta): @abstractmethod def fly(self): pass class Animal: def walk(self): pass def swim(self): pass def fly(self): pass class Oldying(Fly_Animal,Walk_Animal): pass class Tiger(Walk_Animal,Swim_Animal): pass class Swan(Walk_Animal,Fly_Animal,Swim_Animal): pass
广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装
只让自己的对象能调用自己类中的方法
狭义上的封装——面对对象的三大特性之一
属性和方法都藏起来 不让你看见
class Person(): __key = 123 #私有静态属性 def __init__(self,name,password): self.name = name self.__passwd = password #私有属性 def __get_pwd(self): #私有方法 print(self.__dict__) #只要在类的内部使用私有属性,就会自动带上_类名 return self.__passwd def login(self): self.__get_pwd() #所有的私有,都是在变量的左边加上双下划线 #对象的私有属性 #类中私有方法 #类中的静态属性 #所有的私有的 都不能在类的外部使用,只能在类外部使用 alex = Person('alex','alex3714') # print(alex.__passwd) print(alex._Person__passwd) #_类名__属性名 alex.__high = 1 print(alex.get_pwd()) print(alex.__high)