Python编程:元类的简单使用

举报
彭世瑜 发表于 2021/08/14 00:28:31 2021/08/14
1.7k+ 0 0
【摘要】 元类 Python 2.7.5 旧式类 class Foo(): pass foo = Foo() print(type(foo)) print(type(Foo)) print(type(type)) # <type 'instance'> # <type 'classobj'> # <type 'type'> 123456...

元类

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黑魔法:元类

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/89883476

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。