在刚开始接触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()字符串