编程语言
首页 > 编程语言> > 02 Python 魔法函数 和 元类

02 Python 魔法函数 和 元类

作者:互联网

魔法函数

一个类中的魔法函数继承自 object 类
在Python的类中存在一些特殊的方法,这些方法都是 __方法__ 格式,这种方法在内部均有特殊的含义,接下来我们来讲一些常见的特殊成员:

元类

class_name = "User"
class_base = (object, )
class_body = """
def __init__(self, name, age):
    self.name = name
    self.age = age

def func(self):
    print(self.name)
"""

class_dict = {}
exec(class_body, globals(), class_dict)
print(class_dict)


class MyType(type):

    def __init__(self, class_name, class_bases=None, class_dict=None):
        super(MyType, self).__init__(class_name, class_bases, class_dict)

    def __call__(self, *args, **kwargs):

        obj = self.__new__(self, *args, **kwargs)
        self.__init__(obj, *args, **kwargs)
        return obj


User = MyType(class_name, class_base, class_dict)
user_obj = User("hxc", 18)
print(user_obj.name)
class MyType(type):

    def __init__(self, class_name, class_bases=None, class_dict=None):
        super(MyType, self).__init__(class_name, class_bases, class_dict)  # 此处继承调用的是父类 type 中的 __init__ 方法

    def __call__(self, *args, **kwargs):		     # 当你申请对象时 就会触发此函数 object = ClassName()
        obj = self.__new__(self, *args, **kwargs)    # 元类 type 中, 要求 __new__(self, *args, **kwargs) 是这种方式传参
        self.__init__(obj, *args, **kwargs)


class Foo(object):
    __metaclass__ = MyType  # Foo = MyType()

    def __init__(self, name):
        self.name = name

    def __new__(cls, *args, **kwargs):
        return object.__new__(cls)   # 父类创建的空对象 本身是一种数据结构,可以 对象.变量 = "value" 形式赋值


obj = Foo("hxc")  # obj = Foo("hxc") = MyType()("hxc")  此时触发 MyType 中的 __call__ 方法
print(obj.name)

# 代码执行顺序:
# 1 Foo("hxc")
# 2 __metaclass__ = MyType 相当于执行 Foo = MyType()
# 3 执行 MyType 中的 __init__ 函数 class_name:类名; class_bases:父类; class_dict: 名称空间
# 4 执行 MyType 中的 __call__ 函数 得到返回值 返回给对象 obj

标签:02,__,obj,Python,self,元类,print,class,def
来源: https://www.cnblogs.com/FutureHolmes/p/15347463.html