首页 > 其他分享 >Mixins机制、元类简介、产生类的两种方式、元类的进阶操作

Mixins机制、元类简介、产生类的两种方式、元类的进阶操作

时间:2023-07-02 17:56:42浏览次数:55  
标签:__ 进阶 Mixins 元类 init type class cls

Mixins机制

Mixins机制:子类混合不同类的功能,本质仍是多继承,不依赖于子类的实现。

使用:

  1. 主类:就是大部分都是主要的功能

  2. 辅类:就是一些辅助的功能

  3. 辅类的类名也有讲究:一般以mixin、able、ible等结尾

  4. 继承的位置也有讲究

eg:

class Vehicle:  # 交通工具    
    pass
class FlyMinix():    
    def fly(self):      
      '''飞行功能相应的代码'''        
        print("I am flying")
class CivilAircraft(FlyMinix, Vehicle):  # 民航飞机
    pass

class Helicopter(FlyMinix, Vehicle):  # 直升飞机
    pass

class Car(Vehicle):  # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
    pass

import socketserver    

元类

元类:即产生类的类

‘type其实查看的是对象是由哪个类的产生的’

class MyClass(object):
    pass
obj = MyClass()
# <class '__main__.MyClass'>
# print(type(obj)) # 可以查看出obj对象是有哪个类产生的

"""你说我打印type(MyClass) 它的结果应该是什么呢?"""
class type(object):
    print(type(MyClass))  # <class 'type'>  我就可以认为MyClass类就是有type类产生的

我们之前用class造出来的类都是type类造出来的。默认情况下,所有的类的元类就是type

class Student():   
    pass
    print(type(Student)) # <class 'type'>
class C1():    
    pass
    print(type(C1))  # <class 'type'>

产生类的两种方式

1. class 类名():

  pass

2. 由于所有的类都是type类造出来的,所以我们也可以使用type类造出来一个新类,

type(object_or_name,basea,dict)
# 以上三个条件就是造出一个新类
type("类名","父类",“类的名称空间”)

为什么要学习元类?

  元类是造出类的类,所以可以对类进行高度的定制化。

定制化代码:如果想要该类的行为,应该在元类的__init__方法中做修改。

想要改变父类的__init__方法,但是不能直接修改源代码。可以写一个新的子类来继承父类type,然后再子类中写代码,在重新执行一些父类的__init__方法。

对象是如何产生的:执行了产生这个对象的类内部的__init__方法

 """元类不能直接继承"""
class MyTypeClass(type):
    def __init__(self, cls_name, cls_bases=None, cls_dict=None):
        print(cls_name, cls_bases, cls_dict)  # C1 () {'__module__': '__main__', '__qualname__': 'C1'}
        # cls_name:它就是类名
        # 限制类名必须是首字母大写
        if not cls_name.istitle():
            raise Exception("类名必须是首字母大写")
        super().__init__(cls_name, cls_bases=None, cls_dict=None)
               
class C1(metaclass=MyTypeClass):
    school = 'Sh'

class a(metaclass=MyTypeClass):
    pass

元类的进阶操作

类名(),会执行产生类的类中的__call__方法。而这个类恰好是元类type。

class MyClass(type):
    def __call__(self, *args, **kwargs):
        print("__call__ 执行了")
        print(args, kwargs)
        """限制传参的方式必须是关键字传参,只需要args是空就行"""
        if args:
            raise Exception("传参必须是关键字传参")
        super(MyClass, self).__call__(*args, **kwargs)
class C1(metaclass=MyClass):
    def __init__(self, name):
        print("__init__ 执行了")
        # self.name = name
"""看C1类里面的__init__方法和元类里面的__call__方法的执行顺序"""
# 得出结论,其实在执行类的__init__之前,先执行了__call__方法

obj = C1(name='kevin')  # 都是位置传参,强制要求必须是关键字传参

 

标签:__,进阶,Mixins,元类,init,type,class,cls
From: https://www.cnblogs.com/Lucky-Hua/p/17521085.html

相关文章

  • k8s进阶7-initContainer的场景灵活应用
    一、initContainer工作原理初始化容器是在pod的主容器启动之前要运行的容器,主要是做一些主容器的前置工作,它具有两大特征:1、初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成;2、初始化容器必须按照定义的顺序执行,当且仅当前一个成功之......
  • 【JUC进阶】06. 轻量级锁
    目录1、前言2、轻量级锁2.1、什么是轻量级锁2.2、工作原理2.2.1、回顾MarkWord2.2.2、工作流程2.3、解锁3、适用场景4、注意事项5、轻量级锁与偏向锁的对比6、小结1、前言前面一节我们讲到了偏向锁。当偏向锁被撤销,或其他线程竞争的时候,偏向锁会撤销并且升级为轻量级锁。轻量级锁(L......
  • 【2.0】数据库知识点小结数据库进阶
    【2.0】数据库知识点小结数据库进阶【一】存储引擎日常生活中文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制针对不同的数据应该有对应的不同的处理机制存储引擎就是不同的处理机制MySQL主要的存储引擎Innodb是MySQL5.5版本之后的默认存储引......
  • hyper-v 虚拟机 进阶应用知识
    在Hyper-V中,集成服务主要是指Hyper-VIntegrationServices(集成服务),它提供了虚拟机和宿主机之间的协同工作和改进性能的功能。要验证Hyper-V集成服务的功能,可以按照以下步骤进行:您可以使用PowerShell命令来配置Hyper-V虚拟机的动态内存分配。以下是在PowerShell中配......
  • Python面向对象之元类
    Python面向对象之元类【一】前言引入千万不要被所谓“元类是99%的python程序员不会用到的特性”这类的说辞吓住。因为每个中国人,都是天生的元类使用者我们引用太极的思想道生一,一生二,二生三,三生万物即我是谁?我从哪里来?我到哪里去?我们拿到Python中type就相当于我们......
  • python基础day35 Mixins机制和元类
    Mixins机制classVehicle:#交通工具passclassFlyMinix():deffly(self):'''飞行功能相应的代码'''print("Iamflying")'''1.主类:就是大部分都是主要的功能2.辅类:就是一些辅助的功能3.辅类的类名也......
  • Mixins机制和元类
    一、Mixins机制Mixins机制是一种在面向对象编程中用于代码复用的灵活机制,通过将特定功能的代码块注入到类中,增强了类的功能,同时保持了类的层次结构的简洁性和灵活性。案例:定义一个交通工具类,民航飞机和直升飞机、汽车都属与交通工具,继承交通工具类。但是汽车不会飞,将fly的方法......
  • Maven进阶
    前言在项目开发的过程中,我们通常要使用到外部依赖的组件,同时也会使用某些插件来帮助我们管理项目。例如,我们访问数据库的时候需要使用到jdbc组件,我们可以下载对应的jar包去加载到我们的应用中。在我们日常开发大型的项目中,会碰到依赖各种各样的外部服务,各种各样的组件,配置繁琐,依......
  • https 原理分析进阶-模拟https通信过程
    大家好,我是蓝胖子,之前出过一篇https的原理分析,完整的介绍了https概念以及通信过程,今天我们就来比较完整的模拟实现https通信的过程,通过这篇文章,你能了解到https核心的概念以及原理,https证书是如何申请的,以及如何用golang实现https通信,https双向认证。本章代码已经上传到github......
  • Android架构开发进阶指南,Android Jetpack Compose强化实战
    在我们日常的开发中,如果所有人各自为战,没有统一规范,久而久之,项目代码会变得混乱且后续难以维护。而这时,许多人就会使用Jetpack这个由多个库组成的套件,来减少样板代码,以便将精力更多的集中于重要的编码工作上面。统一的架构模式通常会给我们带来诸多好处,如:统一开发规范,使得代码整洁......