Python编程:元类的简单使用

简介: Python编程:元类的简单使用

元类

Python 2.7.5 旧式类

class Foo():
    pass
foo = Foo()
print(type(foo))
print(type(Foo))
print(type(type))
# <type 'instance'>
# <type 'classobj'>
# <type 'type'>


Python 3.6.5 新式类


class Foo():
    pass
foo = Foo()
print(type(foo))
print(type(Foo))
print(type(type))
# <class '__main__.Foo'>
# <class 'type'>
# <class 'type'>



type是一个元类,任何类都是它的实例。

就像一个普通的对象是一个类的实例一样


Python中的任何新式类 以及 Python3中的任何类 都是type元类的一个实例


x是类Foo的一个实例。

Foo是type元类的一个实例。

type也是type元类的一个实例,所以它是它自己的一个实例。



以下测试,在Python 3.6.5 中完成


动态定义类

type函数

type(<name>, <bases>, <dict>)
<name> 类名称 __name__属性
<bases> 继承类的基类元组,__bases__属性
<dict> 包含类主体定义的名称空间字典,__dict__属性


例如


# -*- coding: utf-8 -*-
def get_name(self):
    return "foo"
# 定义类
Foo = type("Foo", (object, ), {"name": "foo", "get_name": get_name})
foo = Foo()
# 获取属性
print(foo.name)
# foo
# 调用方法
print(foo.get_name())
# foo




以上定义的类相当于


class Foo(object):
    name = "foo"
    def get_name(self):
        return "foo"


通过元类的方式给子类添加属性


# -*- coding: utf-8 -*-
class Meta(type):
    def __new__(cls, name, bases, dct):
        instance = super().__new__(cls, name, bases, dct)
        instance.name = "meta"
        return instance
class Foo(metaclass=Meta):
    pass
print(Foo.name)
# meta






通过继承的方式给子类添加属性


# -*- coding: utf-8 -*-
class Base(object):
    name = "meta"
class Foo(Base):
    pass

print(Foo.name)

# meta




通过类装饰器的方式给子类添加属性


# -*- coding: utf-8 -*-
def decorator(cls):
    class NewClass(cls):
        name = "meta"
    return NewClass
@decorator
class Foo(object):
    pass
print(Foo.name)
# meta


参考

Python黑魔法:元类

相关文章
|
1天前
|
机器学习/深度学习 人工智能 数据可视化
Python:探索编程之美
Python:探索编程之美
9 0
|
1天前
|
机器学习/深度学习 人工智能 数据处理
Python编程的魅力与实践
Python编程的魅力与实践
|
2天前
|
SQL 关系型数据库 MySQL
第十三章 Python数据库编程
第十三章 Python数据库编程
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
8天前
|
安全 数据处理 开发者
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
19 1
|
8天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
35 0
|
9天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
21 0
|
10天前
|
Python
Python金融应用编程:衍生品定价和套期保值的随机过程
Python金融应用编程:衍生品定价和套期保值的随机过程
24 0
|
10天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
52 0
|
11天前
|
机器学习/深度学习 算法 定位技术
python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题
python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题
24 1