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