zoukankan      html  css  js  c++  java
  • python 元类 type metaclass

    python中一切皆对象,类对象创建实例对象,元类创建类对象,元类创建元类。

    元类创建类对象有2中方式:

    一、type方法

    type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

    1 Test = type("Test", (), {})
    2 print(Test)
    1 <class '__main__.Test'>

    二、metaclass

     1 # 元类会自动将你通常传给‘type’的参数作为自己的参数传入
     2 def upper_attr(future_class_name, future_class_parents, future_class_attr):
     3     '''返回一个类对象,将属性都转为大写形式'''
     4     #  选择所有不以'__'开头的属性
     5     print(future_class_name, future_class_parents, future_class_attr)
     6     attrs = ((name, value) for name, value in future_class_attr.items()
     7              if not name.startswith('__'))
     8     # 将它们转为大写形式
     9     uppercase_attr = dict((name.upper(), value) for name, value in attrs)
    10 
    11     # 通过'type'来做类对象的创建
    12     return type(future_class_name, future_class_parents, uppercase_attr)
    13 
    14 
    15 # __metaclass__ = upper_attr  # 这会作用到这个模块中的所有类
    16 
    17 
    18 class Foo(object, metaclass=upper_attr):
    19     # 我们也可以只在这里定义__metaclass__,这样就只会作用于这个类中
    20     bar = 'bip'
    21 
    22 
    23 print(hasattr(Foo, 'bar'))
    24 # 输出: False
    25 print(hasattr(Foo, 'BAR'))
    26 # 输出:True
    27 
    28 f = Foo()
    29 print(f.BAR)
    30 # 输出:'bip'
    1 Foo (<class 'object'>,) {'__module__': '__main__', '__qualname__': 'Foo', 'bar': 'bip'}
    2 False
    3 True
    4 bip
  • 相关阅读:
    PLSQL Developer报错(一)
    HTML中的select下拉框内容显示不全的解决办法
    行链接和行迁移
    读UNDO引发的db file sequential read
    direct path read
    db file scattered read
    分区裁剪
    打开CSDN论坛出现403
    Flex中获取RadioButtonGroup中的RadioButton的值
    Excel 2010去掉网格线
  • 原文地址:https://www.cnblogs.com/gundan/p/8194497.html
Copyright © 2011-2022 走看看