zoukankan      html  css  js  c++  java
  • 元类相关(type & metaclass)


    metaclass作用:

    1) 拦截类的创建

    2) 修改类

    3) 返回修改之后的类


    """
    为什么要用metaclass类而不是函数?

    由于__metaclass__可以接受任何可调用的对象,那为何还要使用类呢,因为很显然使用类会更加复杂啊?这里有好几个原因:

    1) 意图会更加清晰。你会知道接下来要发生什么。

    2) 你可以使用OOP编程。元类可以从元类中继承而来,改写父类的方法。元类甚至还可以使用元类。

    3) 你可以把代码组织的更好。当你使用元类的时候,通常都是针对比较复杂的问题。将多个方法归总到一个类中会很有帮助,也会使得代码更容易阅读。

    4) 你可以使用__new__, __init__以及__call__这样的特殊方法。它们能帮你处理不同的任务。就算通常你可以把所有的东西都在__new__里处理掉,有些人还是觉得用__init__更舒服些。

    5) 哇哦,这东西的名字是metaclass,肯定非善类,我要小心!

    究竟为什么要使用元类?

    现在回到我们的大主题上来,究竟是为什么你会去使用这样一种容易出错且晦涩的特性?好吧,一般来说,你根本就用不上它:

    “元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” —— Python界的领袖 Tim Peters
    """


    知识点:
    对象是类创建。创建对象时,类里面的__init__方法会自动执行。 类() 会执行类的__call__方法。
    类是type创建。创建类时,type的__init__方法会自动执行。 类()会执行执行type的__call__方法。执行完__call__方法后,call方法不仅会调用类的__new__方法,还会调用类的__init__方法。

    # 第0步: 执行type的 __init__ 方法【类是type的对象】
    class Foo:
    def __init__(self):
    pass
    
    def __call__(self, *args, **kwargs):
    pass
    
    # 第1步: 执行type的 __call__ 方法
    # 1.1 调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
    # 1.2 调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
    obj = Foo()
    # 第2步:执行Foo def __call__ 方法
    obj()



  • 相关阅读:
    java 运算符的优先级比较
    Java String类和StringBuffer类的区别
    Java 并发编程
    java构造函数和初始化
    Java 动态绑定
    Java day3
    Java day2
    Java day1
    计算机系统原理之程序是怎么运行的 【转】
    MemberCached 学习上【转】
  • 原文地址:https://www.cnblogs.com/Wormhole-f/p/8269205.html
Copyright © 2011-2022 走看看