Python中是否有惯例可快速区分方法级联与方法链式调用?
如何快速区分PySpark中的方法级联与普通方法链式调用
先明确核心定义:
方法链式调用指方法返回一个对象,后续可调用该对象的方法;而方法级联是链式调用的子集,要求返回的是对象自身(
self),即连续调用的都是同一个对象的方法。
针对PySpark场景,有几个实用的惯例可以快速区分两者:
按方法作用判断
- 配置类方法几乎都是级联:这类方法的作用是修改当前对象的配置参数,不会生成新的核心对象。比如PySpark中的
format()、option()、outputMode(),调用后返回原对象本身,可连续调用完成多参数配置。 - 数据转换/动作类方法属于普通链式调用:这类方法会生成新对象或触发执行,返回的对象类型和调用者不同。比如
selectExpr()返回新的DataFrame,load()从DataStreamReader生成DataFrame,start()从DataStreamWriter生成StreamingQuery。
- 配置类方法几乎都是级联:这类方法的作用是修改当前对象的配置参数,不会生成新的核心对象。比如PySpark中的
按返回类型一致性判断
级联调用的所有方法返回类型完全一致,比如第一个示例:df = spark.readStream .format("kafka") # 返回 DataStreamReader .option("kafka.bootstrap.servers", "192.168.1.100:9092") # 返回 DataStreamReader .option("subscribe", "json_topic") # 返回 DataStreamReader .load() # 返回 DataFrame(链式调用,对象类型切换)前几个方法都返回
DataStreamReader,属于级联;最后load()切换为DataFrame,是普通链式调用。第二个示例:
df.selectExpr("CAST(id AS STRING) AS key", "to_json(struct(*)) AS value") # 返回新 DataFrame .writeStream # 返回 DataStreamWriter .format("kafka") # 返回 DataStreamWriter(级联) .outputMode("append") # 返回 DataStreamWriter(级联) .start() # 返回 StreamingQuery(链式调用) .awaitTermination() # 调用 StreamingQuery 的方法writeStream之后的配置方法都是级联,start()切换对象类型后属于普通链式调用。按命名规律判断
PySpark中,以设置、配置为目的的方法(名称多和参数设置相关)通常是级联;而涉及数据处理、触发执行的方法,大多会返回新对象,属于普通链式调用。
总结来说,通过方法的作用、返回类型的连续性、命名规律这几个维度,就能快速判断是级联还是普通链式调用,这对理解陌生类的代码逻辑很有帮助。
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

