1. 何为对象
对象是一种数据抽象或数据结构抽象,用来表示程序中需要处理或已处理的信息。
Python中,对象具有三个基本特征:本征值(identity)、型式(type)和值(value)。
可以尝试运行下列代码:
a = 1
print(id(a)) # identity
print(type(a)) # type
print(a) # value
在Python中,对于id这样解释:
Python中一切皆为对象。除了上边的变量(a),函数和类也是对象。
2. 函数和类作为对象的使用
2.1 将函数和类传入列表
class Person:
def __init__(self):
print("张三")
def print_name(name = "李四"):
print(name)
return "test"
# 实例化Person类
my_class = Person
my_class()
# 将函数和类对象传递到列表对象中
obj_list = []
obj_list.append(print_name)
obj_list.append(Person)
for item in obj_list:
print(item())
输出结果:
张三 // my_class()输出
李四 // 以下均为obj_list[ ]中的元素
test //return值,默认是None
张三
<__main__.Person object at 0x0000018D4A71DF10>
对于输出结果的解释:
<__main__.Person object at 0x0000018D4A71DF10>
意味着在Python中,这是一个类实例对象的默认字符串表示形式。具体来说:
Person
类被定义,其__init__
方法在实例化时打印 "张三"。my_class = Person
将类Person
赋给变量my_class
。my_class()
创建了一个Person
类的实例,输出 "张三"。obj_list
是一个列表,包含了两个对象:print_name
函数和Person
类本身。- 在循环中,
item()
被调用,对于print_name
函数,它会打印 "李四" 并返回 "test",对于Person
类,则输出<__main__.Person object at 0x0000018D4A71DF10>
。
这个输出表示了 Person
类的一个实例的内存地址,每个Python对象在内存中都有一个唯一的地址表示。
2.2 将函数当作返回值(装饰器)
在2.1代码的基础上,运行下列代码:
def decorator_func():
print("start...")
return print_name
#装饰器的用法
my_func_return = decorator_func()
my_func_return("王五")
输出结果:
strat...
王五
另一个装饰器的例子:
def my_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
解释
-
定义装饰器函数
这个装饰器函数接受一个函数my_decorator
:func
作为参数。在my_decorator
内部定义了一个嵌套函数wrapper
,它在调用func
之前和之后打印一些信息。my_decorator
返回wrapper
函数。 -
使用装饰器:
@my_decorator
语法是装饰器的一种便捷用法,相当于say_hello = my_decorator(say_hello)
。say_hello
被替换为wrapper
函数,这个函数在调用func
之前和之后做了一些额外的操作。 -
调用被装饰的函数:
调用say_hello()
时,实际上执行的是wrapper
函数,输出如下:
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
通过这个例子可以看到,装饰器允许你在不改变原始函数定义的情况下,添加额外的行为。这在需要在多处应用相同逻辑(如日志记录、访问控制、计时等)时非常有用。
2.3 将函数作为参数传入其他函数
# 将函数作为一个参数传入另一个函数
def a():
print("这是a函数打印的值")
def b(func):
return func
c = b(a)
c()
输出结果:
这是a函数打印的值
当然,类也是对象,也可以实现将类作为参数传入其他的函数:
class Person:
def __init__(self):
print("这是Person类打印的值")
def b(func):
return func
c = b(Person)
c()
输出结果为:
这是Person类打印的值