ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python:一切皆对象

2020-09-21 08:02:38  阅读:236  来源: 互联网

标签:Python 一切 python object 对象 type class Out


 

学过java语言的童鞋都知道,java是一门面向对象语言,其基本思想就是一切皆对象。Python也是一样的,甚至Python将面向对象思想贯彻地更加彻底,因为在Python中,class本身是一个对象,class实例化出来的实例也是对象,方法函数是一个对象,甚至代码模块都是一个对象,这是java不曾拥有的。

 

对象的一个重要特性就是可以被赋值给其他变量,我们说方法、函数、类都是对象,那么,当然也具有这一特性:

In [1]:
def say(name='张三'):
    print('I am %s' % name)
In [2]:
func = say
func('李四')
 
I am 李四
 

甚至函数内部还可以将函数作为返回值,注意这一特性非常重要,因为这是Python装饰器的基础:

In [20]:
def func(flag):
    if flag:
        def func1():
            return 1
    else:
        def func1():
            return 2
    return func1
In [22]:
f = func(flag=True)
f()
Out[22]:
1
 

再来看看类的赋值:

In [17]:
class Student:
    def __init__(self, name='张三'):
        self.name = name
        print('I am %s' % name)
In [4]:
my_class = Student
In [5]:
my_class('李四')
 
I am 李四
Out[5]:
<__main__.Student at 0x7ff029457910>
 

我们还可以继续讲类和函数放进一个list中:

In [6]:
lst = []
lst.append(func)
lst.append(Student)
In [7]:
lst[0]('王五')
 
I am 王五
In [8]:
lst[1]('王五')
 
I am 王五
Out[8]:
<__main__.Student at 0x7ff0294524d0>
 

可见,类和函数方法都是对象。

 

2 class type object的关系

 

在上文中我们说过,Python中一切皆对象,class也不例外,而class就是用来生成object的对象,那么,既然class也是一个对象,它又是谁生成的呢?没错,就是type,可以这么认为,type就是用来生成class(类)的一种对象。

 

我们知道,Python中有一个type()方法,可以查看传递的实例是有哪个类生成的:

In [24]:
class Person:
    pass
In [26]:
p = Person()
type(p)
Out[26]:
__main__.Person
 

可以看到,type(p)指向的是一个Person类。那么,如果我们对Person类使用type()呢?

In [27]:
type(Person)
Out[27]:
type
 

返回的是一个type,那么,我们可以认为,type是生成Person类的类。type这个类对象本身又是由谁生成的呢?

In [29]:
type(type)
Out[29]:
type
 

可知,type对象也是由type本身生成的。所以,type是最顶层的类,一切类对象都是由type生成。

 

对象和类是两种不同的概念,对象是一个具体的概念,是类这个模板生成出来的。在Python中,类既拥有作为一个对象的特性,也有用对象的特性,我们可以认为,Python类中所拥有的对象的特性是由type所生成、赋予的。那么,Python类所拥有的作为一个类的特性是谁赋予的呢?

那就是object。

在java中,任何一个没有明确指明继承关系的类,都继承object类,在Python中也不例外:

In [30]:
class Person:
    pass
 

调用类的base属性可以查看父类:

In [31]:
Person.__base__
Out[31]:
object
 

在定义Person类时,我们没有指明继承关系,所以,默认就继承自object类。除了自定义的类外,Python的内置类型也一样继承自object:

In [33]:
int.__base__
Out[33]:
object
In [34]:
str.__base__
Out[34]:
object
 

object的父类会是谁?

In [38]:
print(object.__base__)
 
None
 

可知,object没有父类。

 

继续,object类是不是对象呢?肯定是,因为Python无处不对象,那么,object是哪个类实例化生成的呢?

In [35]:
type(object)
Out[35]:
type
 

可见,object是由type这个类生成的。type也是一个类,它的父类是什么呢?

In [36]:
type.__base__
Out[36]:
object
 

这里有点绕,type类实例化了object,type类由继承自object,这不矛盾。无论是type,还是object,它们即是对象,也是类,所以既拥有对象的特性,也拥有类的特性。刚说过,type掌管了对象的特性,object掌管了类的特性,所以两者相互依存。我们 用一幅图来说明,如下图所示,虚线表示对象实例化生成关系,实线表示类的继承关系。所有类都拥有对象的特信息,所以都由type实例化生成,所有对象都拥有类的特性,所以都继承自object。

 

标签:Python,一切,python,object,对象,type,class,Out
来源: https://www.cnblogs.com/chenhuabin/p/13703573.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有