元类言简意赅版解释

元类言简意赅版解释

class mymeta(type):  ## 自定义元类

    ## 自定义元类的init方法是用来控制类的生成的
    def __init__(self,name,base,dict):
        if  name.startswith('a'):
            raise Exception('不能以a开头')

    ## 这个new方法,是用来给type调用的,因为下面的class mycls的时候,就会调用他的元类也就是 mymeta(name,bases,dict),这里就变成了 mymeta加括号,就会调用type的call方法,type的call方法会调用self.__new__,也就是调用了下面的这个new方法,如果没有写这个方法,那就会调用type自身的new,下面的方法也是调用type的new,这里生成的对象是一个类,这个类已经初始化完成了。可以在下面这个__new__方法里面改变类的属性。
    def __new__(cls, *args, **kwargs):
        obj = type.__new__(cls, *args, **kwargs)
        return obj

    ## 这个call方法,是由mymeta类生成的类实例化对象的时候调用的,用来控制类实例化对象的过程。总之call 方法就是用来控制自己生成的类实例化对象的时候用的。
    def __call__(self, *args, **kwargs):
        obj = object.__new__(self)
        obj.__init__(*args, **kwargs)
        if obj.name == 'chanyuli':
            print('yes')
        return obj

class mycls(metaclass=mymeta):
    def __init__(self,name):
        self.name = name

cls = mycls('chanyuli')

print(cls.name)
class mymeta(type)
## 这行代码是一个自定义元类,既然他是一个类,他也是被实例化的,所以他也会调用 type(mymeta,type,dict),又要调用type的元类的call方法,type的元类是他自己,也就是说最后还是调用了type的call方法,是用C语言写的,但是内容至少也要做三步,
class type:
    def __call__(self, *args, **kwargs): # self=<class '__main__.
        # Mymeta'>
        obj=self.__new__(self,*args,**kwargs) # 产生Mymeta的一个对象
        self.__init__(obj,*args,**kwargs) # 初始化类
        return obj

看到最后想到奇怪的问题,上面这个不就是正常情况下自定义一个类吗???
和下面这一毛一样啊
class lalalal()
只不过没有去控制他的生成过程而已。

原文地址:https://www.cnblogs.com/chanyuli/p/12259486.html

时间: 2024-10-08 02:42:01

元类言简意赅版解释的相关文章

python 元类的简单解释

本文转自博客:http://www.cnblogs.com/piperck/p/5840443.html 作者:piperck python 类和元类(metaclass)的理解和简单运用 (一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的类 class Trick(object): pass 当python在执行带class语句的时候,会初始化一

python(七):元类与抽象基类

一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(object): def __init__(self, *args, **kwargs): self.name, self.age, self.gender = args[:3] def __new__(cls, *args, **kwargs): print("__new__ has called.

深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

Objective-C对象之类对象和元类对象

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/8592492 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 作为C语言的超集,面向对象成为Objective-C与C语言的最大区别,因此,对象是Objective-C中最重要的部分之一.目前面向对象的语言有很多,Objective-C中的对象又和其他语言中的对象有什么区别呢?下面来简单介绍Objectiv

Python-深入理解元类(metaclass)

1.使用 type 动态创建类(type 是一个类, 用来创建类对象的元类, 所以也可以继承) type("Person", (), {"name": "John"}) 2.元类 Python 中类也是对象, 元类就是创建这些类对象的类, 可以理解为 MyClass = MetaClass() MyObject = MyClass() 3.type实际上是一个元类, type就是Python在背后用来创建所有类的元类, 类似 str 是创建字符串

深刻理解Python中的元类metaclass(转)

本文由 伯乐在线 - bigship 翻译 英文出处:stackoverflow 译文:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了9

二十七 使用元类

type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name) 当Python解释器载入hello模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象,测试如下: >>> fro

深刻理解Python中的元类

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

python——深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上 很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子 和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段 回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也