何时在 Python 中使用方法级联?
When to use method cascading in Python?
根据我对 Pythonic 编码风格(尤其是 PEP20)的理解,代码必须简单易读。考虑到这一点,方法级联是否被视为 Pythonic?
例如,假设我们有一个 Cascade
class:
class Cascade(object):
def __init__(self, pythonic):
self.question = 'Is this Pythonic?'
self.answer = pythonic
def copy(self):
import copy
return copy.deepcopy(self)
def is_pythonic(self):
return self.answer
那么哪个更好:
>>> cas = Cascade(False)
>>> cas.copy().is_pythonic()
False
否则:
>>> cas1 = Cascade(False)
>>> cas2 = cas1.copy()
>>> cas2.is_pythonic()
False
我认为第一个选项更具可读性,因为我的眼睛从左向右扫视 - 几乎类似于阅读一本书,而第二个选项每行保留一个简单的语句(不可否认,这也具有很高的可读性)。
编辑
根据 Haleemur Ali, Lutz Horn and claust 的有用评论,我想将问题改写为更广泛的 "When should I use method cascading in Python?"
视情况而定。如果你需要
的结果
cas.copy()
以后一定要用第二种方法。如果您不需要它并且 仅 想对其调用 is_pythonic()
,则第一种方法很好。
两者都可以接受。
长链更难阅读,因此尽量避免使用非常长的链。
此外,如果将其分解为单独的语句,您可能会发现重用,即
c = cas1.copy()
c.method1()
c.method2()
c.is_pythonic()
编辑@claust 的评论
另请注意,级联在匿名对象中很有用:我在 GUI 编程中经常使用它,您可以在其中创建对象并将其网格化,而无需稍后引用它:tkinter.Label("label").grid(row =0,列=0)
根据我对 Pythonic 编码风格(尤其是 PEP20)的理解,代码必须简单易读。考虑到这一点,方法级联是否被视为 Pythonic?
例如,假设我们有一个 Cascade
class:
class Cascade(object):
def __init__(self, pythonic):
self.question = 'Is this Pythonic?'
self.answer = pythonic
def copy(self):
import copy
return copy.deepcopy(self)
def is_pythonic(self):
return self.answer
那么哪个更好:
>>> cas = Cascade(False)
>>> cas.copy().is_pythonic()
False
否则:
>>> cas1 = Cascade(False)
>>> cas2 = cas1.copy()
>>> cas2.is_pythonic()
False
我认为第一个选项更具可读性,因为我的眼睛从左向右扫视 - 几乎类似于阅读一本书,而第二个选项每行保留一个简单的语句(不可否认,这也具有很高的可读性)。
编辑
根据 Haleemur Ali, Lutz Horn and claust 的有用评论,我想将问题改写为更广泛的 "When should I use method cascading in Python?"
视情况而定。如果你需要
的结果cas.copy()
以后一定要用第二种方法。如果您不需要它并且 仅 想对其调用 is_pythonic()
,则第一种方法很好。
两者都可以接受。
长链更难阅读,因此尽量避免使用非常长的链。
此外,如果将其分解为单独的语句,您可能会发现重用,即
c = cas1.copy()
c.method1()
c.method2()
c.is_pythonic()
编辑@claust 的评论 另请注意,级联在匿名对象中很有用:我在 GUI 编程中经常使用它,您可以在其中创建对象并将其网格化,而无需稍后引用它:tkinter.Label("label").grid(row =0,列=0)