如何理解Python中一切皆对象这一说法呢?其实不光是Python,很多语言都号称是一切皆对象,这里就拿Java来说吧。其实Java的一切皆对象是伪装的,比如int(Java八种基本数据类型之一)在持久化的时候,就需要包装成Integer类对象。但是在python里面,一切皆对象却是真正做到了这一点,常见的字符串、数字、列表、元组、字典、函数、方法、类、模块等等都是对象,甚至包括你自定义的代码。前面的那些你可能很容易理解,但是这个函数和类也是对象可能就不是那么好理解了,下面我们就来谈谈它们两个的具体使用。

你知道的,对象一般都具有四个特点,这也是面向对象编程的一个主要体现,然后分别用代码来实现这些功能。

  • 可以复制给一个变量;
  • 可以添加到集合中 ;
  • 可以作为参数传递给函数;
  • 可以当做函数的返回值。

可以复制给一个变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def ask(name="lichee"):  # 函数赋值给一个变量
print(name)

a = ask
a()



class Person: # 类赋值给一个变量
def __init__(self):
print("envse")

boy = Person
boy()

可以添加到集合中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def ask(name="lichee"):  # 函数可以添加到集合中
print(name)


def tell(thing="hello ,world"):
print(thing)


def write(code="hi"):
print(code)

obj_list = []
obj_list.append(ask)
obj_list.append(tell)
obj_list.append(write)
for obj in obj_list:
obj()

# 输出结果:
lichee
hello ,world
hi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

class Person: # 类可以添加到集合中
def __init__(self):
print("envse")


class Boy:
def __init__(self):
print("Boy")


class Gril:
def __init__(self):
print("Gril")

test_lists =[]
test_lists.append(Person)
test_lists.append(Boy)
test_lists.append(Gril)
for test_list in test_lists:
test_list()

# 输出结果:
envse
Boy
Gril

可以作为参数传递给函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def ask(name="lichee"):   # 函数可以作为参数传递给函数
print(name)


def tell(ask):
return ask


youtell = tell(ask)
youtell()
# 输出结果:
envse



class Person: # 类可以作为参数传递给函数
def __init__(self):
print("envse")


def decorator_fun(Person):
return Person


test = decorator_fun(Person)
test()

可以当做函数的返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def ask(name="lichee"):   # 函数可以当做函数的返回值
print(name)


def decorator_fun():
return ask


test = decorator_fun()
test("test")
# 输出结果:
test



class Person: # 类可以当做函数的返回值
def __init__(self):
print("envse")


def decorator_fun():
return Person

test = decorator_fun()
test() # 这两步其实就是 Person()的作用

对象

对象一词在不同的编程语言里有不同的解释。在一些语言里面,所有对象必须有属性和方法;而另一些语言则是所有的对象都可以子类化。

照这么看的话,在Python中是不存在对象的,那怎么又说一切皆对象呢?因为Python对象的定义是松散的,没有非常明确的界定。对于某些对象而言,它们确实既没有属性也没有方法,而且不是所有的对象都可以子类化。只要具有上面四个特点就是对象。

也正因为如此,所有的对象具有3个特性:身份,类型和值。

身份,每个对象都有一个唯一的标识符,任何对象的身份都可以使用内建函数 id() 来得到,可以简单的认为这个值就是该对象在内存中的地址:

1
2
3
>>> a=1
>>> id(a)
1848471008

类型,每个对象可以保存什么类型的值是由该对象的类型决定的,任何对象的类型可以使用内建函数 type() 来查看:

1
2
3
>>> a=1
>>> type(a)
<class 'int'>

,该对象所表示的数据,其实就是通过赋值语句所得到的那个值(指向的值,不可变类型):

1
2
3
4
5
6
7
8
9
>>> a=1
>>> id(a)
1848471008

>>> a
1
>>> id(1)
1848471008

“身份”、”类型”和”值”在所有对象创建时就被赋值了。只要对象还存在,这三个特性就一直存在。需要注意的是,如果对象支持更新操作,则它的值是可变的,否则为只读(数字、字符串、元组等均不可变)。