Python中一切事物都是对象之类创建的本质(python的一切内容都可以称为对象)

网友投稿 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类对象应该也是通过执行某个类的 构造方法 创建。

12​​print​​​​type​​​​(obj) ​​​​# 输出: 表示,obj 对象由Foo类创建​​​​print​​​​type​​​​(Foo) ​​​​# 输出: 表示,Foo类对象由 type 类创建​​

所以,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=====------<__main__.Foo object at 0x0000000000714160>123


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python自动化--1.Python环境安装-linux(Python环境安装)
下一篇:Spring Boot Jar 包部署脚本的实例讲解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~