三大特性是:封装,继承,多态
五大基本原则
1.单一职责原则SRP(Single Responsibility Principle)
2.开放封闭原则OCP(Open-Close Principle)
3.替换原则(the Liskov Substitution Principle LSP)
4.依赖原则(the Dependency Inversion Principle DIP)
5.接口分离原则(the Interface Segregation Principle ISP)
一。封装
加双下划线变成私有。都不能在类的外部使用。对象的私有属性方法静态私有属性 @property 被修饰的方法不能传任何参数 将方法伪装成属性。 @方法名.mideleter 与类外的 del 关联 @ setter 例:@property def name(self): return self.__name @name.deleter def name(self): del self.__name
二。继承
# 组合 一个对象的属性值是另一个类的对对象 # 继承 可以继承一个或多个父类(别名:基类或超类) 一个类可以被多个类继承,子类可以找到父类,父类找不到子类 派生:在原有属性上增加新的属性。 使用super()调用父类的方法,也可以父类实例化调用父类方法 super(类,实例)类外也可用。 正常使用单继承 # 多继承 从第一个找,没有找第二个 广度优先 .mor() 可以查看继承顺序 2.7 经典类是深度优先,新式类(要继承object)是广度优先 super() mor() 只在新式类里有。 super()不是直接调用父类,而是调用节点的顺序
# 接口类 有关设计模式 python 原生不支持 接口类支持多继承,方法不能实现 接口隔离原则,使用多个接口,而不是使用单一的总接口 例: from abc import abstractmethod, ABCMeta class Payment(metaclass = ABCMeta): @abstractmethod def pay(self, money) pass # 抽象类 python 原生支持 若没有实现抽象类的方法就会报错 不支持多继承,可以实现方法 # 能实现的功能都是一样的, 都是面向对象的开发规范。接口类 import abc class ALL_file(metaclass=abc.ABCMeta) @abc.abstractmethod # python 崇尚鸭子类型 list 和 tuple 很相似 却没有用父类约束 优点:松耦合,每个相似的类没有影响 缺点: 太随意 # 类方法 @classmethod 类的操作行为 例:@classmethod def change_method(cls): pass # 静态方法 @staticmethod 在完全面对对象的过程中,一个函数与 类和对象完全没有关系时使用
三。多态
多态顾名思义 即一个接口的多种实现方式,子类实力指向父类对象的用法称为多态中的向上转型,多用于方法参数,类中的实例属性,以及函数返回值中,向上转型时父类对象只能调用本类所拥有的实例,如果父类中有和子类定义相同名称的方法,则优先调用子类实例中的方法
四。进阶:反射
在python中的反射是指:可以通过字符串去操作对象的相关属性(类本身也是对象)
通过四个函数实现内省:hasattr(),getattr(),delattr(),setattr()
getatter 通过字符串范文变量 例:getatter(类名,‘变量名’) getatter(类名, '函数名')返回函数地址 hasattr() 于getatter相似,返回布尔值 类内置方法: __str__ 一但被调用就返回调用这个方法的内存地址,可自定义但只能返回str类型 %s,str()打印对象时自动调用__str__ __repr__ repr是str的备胎, 如果没有str会优先查找repr,再找父类,优先实现 __len__ 可以定制对象的长度。 __del__ 析构函数 执行顺序,先执行,后删除 内部有引用计数当为0时删除或超过700删除 在删除对象前做一些收尾工作 __call__ 一个对象加括号,相当于执行__call__方法 item系列 __getitem__ 是对象支持字典方式获得 a['name'] __setitem__ 设置 __delitem__ 删除 del a['name'] __new__ 构造方法。 先执行new造出新对象,在给__init__ 单例模式:class A: __instance = False def __init__(self,name) self.name = name def __new__(cls, *args, **kwargs) if cls.__istance: return cls.__instance cls.__instance = object.__new__(A) return cls.__instance # set 依赖于__eq__ __hash__ __eq__ 不实现时默认比较内存地址,可以自己判断比较条件 __hash__ 实现了就变为可哈希的
# 以后学的多了再回来进行补充