Flask接口签名sign原理与实例代码浅析
308
2022-09-08
Python中一切事物都是对象之类创建的本质(python的一切内容都可以称为对象)
读以下代码:
class Foo(object): def __init__(self): pass obj = Foo() # obj是通过Foo类实例化的对象
上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。
如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。
12printtype(obj) # 输出:
所以,obj对象是Foo类的一个实例,Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。
那么,创建类就可以有两种方式:
a). 普通方式
class Foo(object): def func(self): print 'hello wupeiqi'
b).特殊方式(type类的构造函数)
def func(self): print 'hello wupeiqi' Foo = type('Foo',(object,), {'func': func})#type第一个参数:类名#type第二个参数:当前类的基类#type第三个参数:类的成员
==》 类 是由 type 类实例化产生
那么问题来了,类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?
答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。
class MyType(type):
def __init__(self, what, bases=None, dict=None):
super(MyType, self).__init__(what, bases, dict)
def __call__(self, *args, **kwargs):
obj = self.__new__(self, *args, **kwargs)
self.__init__(obj)
class Foo(object):
__metaclass__ = MyType
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
return object.__new__(cls, *args, **kwargs)
# 第一阶段:解释器从上到下执行代码创建Foo类
# 第二阶段:通过Foo类创建obj对象
obj = Foo()
#!/usr/bin/env python# -*- coding: utf-8 -*-class MyType(type):def __call__(cls, *args, **kwargs):
#cls是类class属性 obj = cls.__new__(cls,*args,**kwargs)
#在执行type类的new方法的时候 此处已经创建对象print("=====")print(cls)
#__init__方法只是初始化而已 不写也可以
obj.__init__(*args,**kwargs)return objclass Foo(metaclass=MyType):def __init__(self,name):print("------")self.name=namedef f1(self):print(self.name)#解释器解释#1,遇到class Foo,执行type的__init__方法#2,Type的init的方法里面做什么呢?不知道 C语言写的 无法修改obj = Foo(123)//执行type的call方法print(obj)print(obj.name)#3,执行Type的__call__方法# 执行Foo类的__new__方法# 执行Foo类的__init__方法
C:\Python35\python.exe D:/py_django/test/a2.py=====
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~