Python 面向对象知识点补充
【一】Mixins机制
【1】概念
- Mixins:是一种在面向对象编程中,通过组合多个类的特称来创建一个新类的技术
- 核心机制:就是在多继承的背景下尽可能地提升多继承的可读性
- 通过命名规范来满足人的思维习惯(什么是什么的关系)
【2】代码
class PeaShooter:
pass
class ShootMixin:
def shoot(self):
print("I can shoot pea")
class FirePeaShooter(ShootMixin, PeaShooter):
pass
class IcePeaShooter(ShootMixin, PeaShooter):
pass
【3】解释
- 在这个例子中火焰豌豆射手和寒冰豌豆射手都实现了多继承,不过他们继承的第一个类起名为ShootMixin,而不是Shoot,这不影响功能。只是告诉读代码的人,这个类是一个Mixin类,表示混入(mix-in),这种命名方式就是明确的告诉别人,这个类作为功能添加到子类中,而不是作为父类
- 注意要点:
- 这个类表示功能,而不是某个物品
- 一般以Mixin、able、ible为后缀
- 责任单一,即多个功能要写多个Mixin类
- 父、子类中都需要这个功能时,只放在父类里面
- 不依赖于子类的实现;子类即便没有继承这个Mixin类,mIxin类也可以正常工作
- 通常放在子类括号的左边
- 当定义的Mixin类越多,子类代码可读性越差,不推荐继承的结构过于复杂
【二】abc模块
【1】概念
- abc模块是python中的抽象基类模块,它提供了一种机制来定义抽象基类以及在子类中强制实现特定的方法
- 抽象基类是不能被实例化的类,主要目的是作为其他类的基类,强制子类实现指定的方法。
【2】代码
import abc
class RegisterLogin(metaclass=abc.ABCMeta):
@abc.abstractmethod
def login(self):
pass
@abc.abstractmethod
def register(self):
pass
class BankSys(RegisterLogin):
def login(self):
pass
def register(self):
pass
by = BankSys()
【3】解释
- 在父类中需要继承
ABC类
(
ABC类是
抽象基类`的基类) - 使用**@abstractmethod装饰器定义抽象方法**
- 如果子类没有定义这个方法,在实例化时会报错
- 抽象基类实例化也会报错
【三】类的特殊属性
class Base1:
pass
class Base2(Base1):
pass
class Base3(Base2):
pass
class A(Base3, Base1):
"""文档注释"""
pass
【1】__name__
print(A.__name__, type(A.__name__))
【2】__doc__
print(A.__doc__, type(A.__doc__))
【3】__base__
print(A.__base__, type(A.__base__))
【4】__bases__
print(A.__name__, type(A.__name__))
【5】__dict__
- 获取类的字典属性,表示类的名称空间
mappingproxy
类型,表示是一个映射试图,保护类属性不被意外修改
print(A.__dict__, type(A.__dict__))
【6】__module__
print(A.__module__, type(A.__module__))
【7】__class__
a = A()
print(a.__class__, type(a.__class__))
【四】两个判断函数
isinstance(obj, cls)
issubclass(sub, super)
class A:
pass
class B(A):
pass
a = A()
print(isinstance(a, A))
print(isinstance(a, B))
print(issubclass(B, A))
print(issubclass(A, B))
print(issubclass(A, object))
print(issubclass(B, object))
print(isinstance(1, float))
print(type(1.1) == int)
print(isinstance("1", str))
print(type("") == str)
【五】总结