继承:什么是什么关系
组合:什么有什么关系
单继承
先抽象再继承,几个类直接的相同代码抽象出来,成为父类
子类自己没有的名字可以使用父类的方法和属性
如果子类自己有,一定先用自己的
在类中使用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)

 

posted on 2019-02-05 22:58  Tim-code  阅读(153)  评论(0编辑  收藏  举报