Python难点解析---初级篇2.一切皆对象

在刚开始接触Python的时候,就一直听到一句话:

一切皆对象

那么,对于对象他有一些什么重要的属性呢。

Python对象的属性

对于一个对象而言,他首先应该是具备类型这一属性,那么类型对应的则是,由于对象都是在内存中生存的,所以他也应该拥有一个地址
因此,作为一个对象,他会有以下三个属性:

  • 类型
  • 地址

先看以下代码,对于一个变量a有以下的定义:

a = 1
b = "hello world"
c = [1,2,3]

print a, type(a), id(a)
print b, type(b), id(b)
print c, type(c), id(c)

output:
1 <type 'int'> 38567656                                                                                                                                                                                                                
hello world <type 'str'> 43878752                                                                                                                                                                                                      
[1, 2, 3] <type 'list'> 43862216

通过type函数可以直接获得对象的类型。
通过id函数可以直接获得对象的地址。

一切皆对象

基本数据类型实例是对象

Python有以下几种基本数据类型:

#数字
1234, 3.14, 1231L, 3+4j, Decimal
#字符串
'hello', "world"
#列表
[1,2,3,4]
#元组
(1, "hello", 2)
#字典
{1 : "hello", 2 : "world"}
#文件
file = open("file.txt", 'r')
#其它类型
集合,类型,None,布尔型

类是对象

除了上面列举的a,b,c三个是对象,也是一个对象,类是元类的实例。

class C(object):
    def __init__(self):
        pass

print type(C)

>>><type 'type'>

由上面的代码可以看到,类C是<type ‘type’>的实例,<type ‘type’>是类的类,我们称为元类,元类是用来定制类的关键。这点暂时不做展开。

函数是对象

除了上面这些,函数也是对象,具体可以看下面的代码。

def foo():
    print "foo"

a = foo
a()

>>>foo

从代码中可以看到,函数可以作为一个对象来进行传递,这一特性加上闭包则是Python的语法糖装饰器

def wrap(func):
    def wrapper(*args, **kwargs):
        print "Hello %s" % func.__name__
        func(*args, **kwargs)

    return wrapper

@wrap
def foo():
    print "foo"

a = foo
a()
>>>Hello foo                                                                                                                                                                                                                              
>>>foo 

装饰器将函数作为一个对象传入,a = wrap(foo),执行的时候则会执行Hello foo的语句然后再执行foo函数,装饰器是AOP(面向切面编程)的一种用法,可以在不改变函数结构的情况下通过语法糖插入日志、性能调试等功能。

补充:对象分类

Python的基本数据类型按是否可变可以分为:

  • 可变数据类型
  • 不可变数据类型

可变数据类型:

指在运行过程中可以更改其值的数据类型,常见的有list(列表)dict(字典)

不可变数据类型:

指在运行过程不可以改变值的数据类型,常见的有tuple(元组)num(数字)str()字符串

    原文作者:ZeroTryTryTry
    原文地址: https://www.jianshu.com/p/3b4c9dea66e3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞