Python 面向对象知识点补充

发布时间:2024年01月07日

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() 
# 尝试实例化抽象基类
# a = RegisterLogin() # 报错

【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__))
# A <class 'str'>

【2】__doc__

  • 获取类的注释文档,字符串格式
print(A.__doc__, type(A.__doc__))
# 文档注释 <class 'str'>

【3】__base__

  • 获取类的第一个父类,返回一个类
print(A.__base__, type(A.__base__))
# <class '__main__.Base3'> <class 'type'>

【4】__bases__

  • 获取类的所有父类(仅第一层),返回元组格式
print(A.__name__, type(A.__name__))
# A <class 'str'>

【5】__dict__

  • 获取类的字典属性,表示类的名称空间
  • mappingproxy类型,表示是一个映射试图,保护类属性不被意外修改
print(A.__dict__, type(A.__dict__))
# {'__module__': '__main__', '__doc__': '文档注释'} <class 'mappingproxy'>xxxxxxxxxx print(A.__dict__, type(A.__dict__))# {'__module__': '__main__', '__doc__': '文档注释'} <class 'mappingproxy'>name__))# A <class 'str'>

【6】__module__

  • 获取类定义所在的模块,字符串格式
print(A.__module__, type(A.__module__))
# __main__ <class 'str'>

【7】__class__

  • 获取对象所属的类名
a = A()
print(a.__class__, type(a.__class__))
# <class '__main__.A'> <class 'type'>

【四】两个判断函数

  • isinstance(obj, cls)
    • 判断obj是不是cls的实例
  • issubclass(sub, super)
    • 判读sub是不是super的子类
class A:
    pass

class B(A):
    pass


a = A()
print(isinstance(a, A)) # True
print(isinstance(a, B)) # False

print(issubclass(B, A)) # True
print(issubclass(A, B)) # False

print(issubclass(A, object)) # True
print(issubclass(B, object)) # True
  • isinstance()还可以用来判断类型
print(isinstance(1, float)) # False
print(type(1.1) == int) # False

print(isinstance("1", str)) # True
print(type("") == str) # True

【五】总结

请添加图片描述

文章来源:https://blog.csdn.net/weixin_48183870/article/details/135443886
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。