一、函数后面的括号
示例:
def fun(args):
return args
alias = fun # alias: <function fun at 0x00000261B9642AE8>
alias_value = alias('alias_args') # alias_value: 'alias_args'
return_value = fun('args_val') # return_value: 'args_val'
上面注释是我们得到结果:
- 不带括号时,我们是把函数对象赋值给了alias,并不是实际执行该函数。
- 也可以看成取fun函数所在的内存地址赋值给alias
- 也可以看成给fun函数起了另外一个名字,所以我们alias(‘alias_args’)可以直接使用fun函数功能
- 带括号时,就相当于调用了这个函数,如果此函数有形参,就必须对其赋值。返回return的结果。
对于函数后面不带括号的使用方法,在python中很常见,往往是作为一个变量传递给另外一个函数。举个例子:
def square(x):
return x ** 2
list_before = [1, 2, 3, 4, 5] # list_before: [1, 2, 3, 4, 5]
list_after = list(map(square, list_before)) # list_after: [1, 4, 9, 16, 25]
上面例子中square就作为一个参数传递给了map,这样map函数里面就可以直接调用square函数了。
二、类后面的括号
class Test:
class_attribute = 'class_attribute'
def __init__(self):
self.class_attribute = 'init_value'
class_value = Test.class_attribute # class_value: 'class_attribute'
init_value = Test().class_attribute # init_value: 'init_value'
上面注释是我们得到结果:
- 不带括号时,相当于我们对类直接操作,上面直接读取类的属性(class.attribute方式)。
- 带括号时,相当于我们对类进行实例化,得到了一个__init()__后的对象。上面__init()__中对class_attribute进行了修改。所以实例化后对象的class_attribute属性值为 ‘init_value’。
根据上面类不带括号的操作,我们可以直接修改类属性。
class Test:
class_attribute = 'class_attribute'
variable_value = 'variable_value'
def __init__(self):
self.class_attribute = 'init_value'
variable_value_before = Test.variable_value # variable_value_before: 'variable_value'
variable_value_instance_before = Test().variable_value # variable_value_instance_before: ''variable_value''
Test.variable_value = 'modify_value'
variable_value_instance_after = Test().variable_value # variable_value_instance_after: ''modify_value''
从上述例子可知,直接修改类属性后会对后面实例化的对象有影响。