• Python -- OOP高级 -- 元类



    type()函数既可以返回一个对象的类型,又可以创建出新的类型

    def fn(self, name="world"):
        print("Hello, %s!" % name)
        
    Hello = type("Hello", (object,), dict(hello=fn))

    
    h = Hello()
    
    >>> h.hello()
    Hello, world!
    
    >>> type(h)
    Out[165]: __main__.Hello
    
    >>> type(Hello)
    Out[166]: type

    要创建一个class对象,type()函数依次传入3个参数:

    1. class的名称;
    2. 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
    3. class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。

     


    metaclass
    除了使用type()动态创建类以外,要控制类的创建行为,还可以使用元类(metaclass)。

       先定义metaclass,就可以创建类,最后创建实例。

       metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。

    一个简单的例子,这个metaclass可以给我们自定义的MyList增加一个add方法:

    定义ListMetaclass,按照默认习惯,metaclass的类名总是以Metaclass结尾,以便清楚地表示这是一个metaclass:

    # metaclass是类的模板,所以必须从`type`类型派生:
    class ListMetaclass(type):
        def __new__(cls, name, bases, attrs):
            attrs['add'] = lambda self, value: self.append(value)
            return type.__new__(cls, name, bases, attrs)
    
    class MyList(list, metaclass=ListMetaclass):
        pass

    
    
    >>> L = MyList()
    >>> L.add(1)
    >> L
    [1]

    __new__()方法接收到的参数依次是:
    1. 当前准备创建的类的对象;

    2. 类的名字;

    3. 类继承的父类集合;

    4. 类的方法集合。


    应用实例

    ORM

    ORM(Object Relational Mapping),即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。

    KEEP LEARNING!
  • 相关阅读:
    Java设计模式之单例模式
    Bootstrap-table使用footerFormatter做统计列
    Bootstrap进度条
    基于Bootstrap的表格插件bootstrap-table
    基于Bootstrap的对话框插件bootstrap-dialog
    基于Bootstrap的下拉框插件bootstrap-select
    JsonConfig处理日期时间
    Jquery表单验证插件validate
    Hibernate使用Criteria去重distinct+分页
    设置iframe高度自适应屏幕高度
  • 原文地址:https://www.cnblogs.com/roronoa-sqd/p/4900471.html
Copyright © 2020-2023  润新知