首页 > 编程语言 >python基础day35 Mixins机制和元类

python基础day35 Mixins机制和元类

时间:2023-06-29 16:33:07浏览次数:55  
标签:__ python day35 Mixins 元类 init type class cls

Mixins机制

class Vehicle:  # 交通工具
    pass

class FlyMinix():
    def fly(self):
        '''
        飞行功能相应的代码
        '''
        print("I am flying")

'''
1. 主类:就是大部分都是主要的功能
2. 辅类:就是一些辅助的功能
3. 辅类的类名也有讲究:一般以mixin、able、ible等结尾
4. 继承的位置也有讲究:一般辅类在左边,主类在右边
'''
class CivilAircraft(FlyMinix, Vehicle):  # 民航飞机
    pass


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

元类简介

# 什么是元类?
    # 即产生类的类
'''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 Student():
    pass

# print(type(Student)) # <class 'type'>


class C1():
    pass

print(type(C1))  # <class 'type'>

'''
得出结论:我们之前使用class造出来的类都是由type类造出来的
所以说默认情况下,所有的类的元类都是type
'''

产生类的两种方式

1. class 类名():

  pass

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

type(object_or_name, bases, dict)
    # 这三个条件就是造出来类的三个要素.
    # type("类名", "父类", "类的名称空间")

3. 为什么要学习元类?

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

eg:

  限定写出的类名必须是首字母大写的

  思考:定制化代码在哪里写?

     类是如何产生的?类是由元类产生的type类,如果想改类的行为,应该在元类里的__init__方法中改。

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

推导:已知推出来的未知

想改父类的__init__方法,但是又不能修改源代码,所以我们可以写出来一个子类来继承父类type,在子类里面写代码,然后重新执行一些父类的__init__方法。

ps:元类不能直接继承

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__
# 对象加括号会自动调用类的__call__方法,并且__call__方法里面返回神恶魔,那么对象加括号的位置就是什么
# 推导:类名()会怎么样?
'''类名(),应该会执行产生类的类中的__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')  # 都是位置传参,强制要求必须是关键字传参

 

标签:__,python,day35,Mixins,元类,init,type,class,cls
From: https://www.cnblogs.com/zfq132/p/17514538.html

相关文章

  • python打包exe总结 pyinstaller py2exe
    Python打包exe有挺多可以用的如pyinstallerpy2exe cx_Freezenuitkapy2apppy0xidizer cx_Freeze和nuitka没用过py2app是打包Mac程序的py0xidizer是打包嵌入式的占用空间少感兴趣可以自行了解 这篇文章记录一下pyinstaller和py2exe的用法 以便以后查找  注:以下都......
  • npm install报gyp ERR! stack Error: Can't find Python executable "python", you ca
    1gypERR!stackError:Can'tfindPythonexecutable"python",youcansetthePYTHONenvvariable.2gypERR!stackatPythonFinder.failNoPython(/Users/scott/project/dx_project/front_project/workflow-frontend-elem/node_modules/node-......
  • Python Flask - 快速构建Web应用详解
    本文将详细探讨PythonFlaskWeb服务。我将首先简单介绍Flask,然后将逐步进入Flask中的路由、模板、表单处理以及数据库集成等高级概念,目标是能够让大家了解并掌握使用Flask来创建动态Web应用的技巧。1.Flask简介Flask是一个轻量级的Web服务器网关接口(WSGI)web应用框架。它被设计......
  • Python错误:requests请求https网站报错SSLError
    问题描述:用requests包请求https的网站时,经常会遇到证书问题,也就是常见的SSLerror:requests.exceptions.SSLError:HTTPSConnectionPool(host='www.xxx.com',port=443):Maxretriesexceededwithurl:xxx.html(CausedbySSLError(SSLCertVerificationError(1,'[S......
  • Python错误:requests请求设置verify=False时日志中有warning信息
    问题描述:在requests做请求的时候,为了避免ssl认证,可以将verify=False,但是这么设置会带来一个问题,日志中会有大量的warning信息,如下面:D:\ProgramFiles\Python\lib\site-packages\urllib3\connectionpool.py:1045:InsecureRequestWarning:UnverifiedHTTPSrequesti......
  • Manim基于python的数学可视化领域的佼佼者
    Manim是3Blue1Brown大佬为了制作数学动画而自己写的一个基于python的库作者:pdcxshttps://www.bilibili.com/read/cv3387999出处:bilibili数学可视化领域的佼佼者。通过Manim,你可以用编程的方式生成精确的数学视频。Manim’sdocumentationhttps://3b1b.github.io/manim/index.......
  • Mixins机制和元类
    一、Mixins机制Mixins机制是一种在面向对象编程中用于代码复用的灵活机制,通过将特定功能的代码块注入到类中,增强了类的功能,同时保持了类的层次结构的简洁性和灵活性。案例:定义一个交通工具类,民航飞机和直升飞机、汽车都属与交通工具,继承交通工具类。但是汽车不会飞,将fly的方法......
  • 【Python&RS】基于GDAL镶嵌拼接遥感影像
    ​    没啥好说的,处理高分辨率影像时,数据高达几十G。用ENVI或者ArcGIS进行影像的拼接时,往往会出现未响应的情况。出现未响应的话,运气好等个一晚上可能会动一动,运气不好就等着强制关闭重做吧。        所以搞了一个Python进行拼接操作的代码,虽然速度不算快,但至......
  • 【python爬虫案例】用python爬豆瓣读书TOP250排行榜!
    目录一、爬虫对象-豆瓣读书TOP250二、python爬虫代码讲解三、讲解视频四、完整源码一、爬虫对象-豆瓣读书TOP250今天我们分享一期python爬虫案例讲解。爬取对象是,豆瓣读书TOP250排行榜数据:https://book.douban.com/top250​开发好python爬虫代码后,爬取成功后的csv数据,如下:​......
  • Python调试中特殊的属性值: __iter__
    在调试python源码时遇到一件奇怪的事情,某个属性的值为__iter__,并且给它明确的赋别的值,发现并没有作用,如下所示:仔细思考了一下,有点儿明白了,__getattr__方法的作用是当找不到对象的属性时会调用此函数,这时,method的值'deviceInfo'就是此对象不存在的属性,所以进......