码迷,mamicode.com
首页 > 编程语言 > 详细

理解python的元类

时间:2018-03-26 23:34:36      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:__new__   base   通过   引用   value   __init__   文章   ##   object   

看了一篇文档,借鉴一下!写下自己对python元类的理解,欢迎各位大神给出意见。

我的理解就是

type用来创建元类,元类用来创建类,类用来创建实例

这样一想,是不是可以认为元类创建类的过程等同于类创建实例,类创建不同的实例,虽然每个实例都有类似的属性,方法,但具体都是不一样的!

class Fruits():
    def __init__(self,name,color):
        self.name=name
        self.color=color

    def __new__(cls,name,color):
        return object.__new__(cls)


apple=Fruits(apple,red)
print(apple.name)
print(apple.color)

banana=Fruits(banana,yellow)
print(banana.name)
print(banana.color)

类的两个实例apple,banana都有同样的属性name,age,但是各自的值确实不同的,都属于水果类,但却是不同的水果。。

 

再来看元类定制类的过程,直接引用大神的代码吧

元类创建类的过程中也可以认为是每个类都有相同的地方(比如都是一个元类创建,都有共同的Fu类),也有各自不同的地方(每个类的类名不同,实现的方法也不同)

# 猜想,类中的new方法是用来创建实例的
# 元类的new方法是用来创建类的?

# 道生一:传入type
class SayMetaClass(type):

    # 传入三大永恒命题:类名称、父类、属性
    def __new__(cls, name, bases, attrs):
        print("test, new is running!")
        # 创造“天赋”
        attrs[say_ + name] = lambda self, value, saying=name: print(saying + , + value + !)
        # 传承三大永恒命题:类名称、父类、属性
        return type.__new__(cls, name, bases, attrs)

#########Hello类
# 一生二:创建类
class Hello(object, metaclass=SayMetaClass):
    pass
# 二生三:创建实列
hello = Hello()
# 三生万物:调用实例方法
hello.say_Hello(world!)

#########Nihao类
# 一生二:创建类
class Nihao(object, metaclass=SayMetaClass):
    pass
# 二生三:创建实列
nihao = Nihao()
# 三生万物:调用实例方法
nihao.say_Nihao(world!)

 

这就是一个元类创建类的过程,通过class Hello(object, metaclass=SayMetaClass):  创建类,在创建的时候调用了元类的__new__方法(这里似乎发现一个通性:类的new方法用来创建实例,元类的new方法用来创建类)通过这个元类的new方法创建了类Hello跟Nihao,Hello拥有私人定制的say_**方法,是不是跟类的实例有点类似,这样理解起来感觉简单多了。。

 

文章链接:http://python.jobbole.com/88795/

 

理解python的元类

标签:__new__   base   通过   引用   value   __init__   文章   ##   object   

原文地址:https://www.cnblogs.com/chilo/p/8654602.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!