Python 我是否将参数的副本或参数本身传递给_init__;中的函数?

Python 我是否将参数的副本或参数本身传递给_init__;中的函数?,python,arguments,Python,Arguments,我想知道以下两种选择中的哪一种更好,或者可能更像蟒蛇: 直接将\uuuuu init\uuuuu参数用作在\uuuuu init\uuuu中调用的函数的参数: def class A(object): def __init__(self, x): self.x = x # I would like to do this anyway self.y = foo(x) # More code def class B(object):

我想知道以下两种选择中的哪一种更好,或者可能更像蟒蛇:

  • 直接将
    \uuuuu init\uuuuu
    参数用作在
    \uuuuu init\uuuu
    中调用的函数的参数:

    def class A(object):
        def __init__(self, x):
            self.x = x # I would like to do this anyway
            self.y = foo(x)
            # More code
    
    def class B(object):
        def __init__(self, x):
            self.x = x # I would like to do this anyway
            self.y = foo(self.x)
            # More code
    
  • 使用作为参数副本的
    \uuuuu init\uuuu
    属性作为在
    \uuuuu init\uuu
    中调用的函数的参数:

    def class A(object):
        def __init__(self, x):
            self.x = x # I would like to do this anyway
            self.y = foo(x)
            # More code
    
    def class B(object):
        def __init__(self, x):
            self.x = x # I would like to do this anyway
            self.y = foo(self.x)
            # More code
    
  • A类和B类的行为应该相同。然而:

  • 第一种选择不太冗长,因为避免了大量的
    自我输入。
    并且代码更具可读性

  • 第二种选择可能对代码中的进一步更改更为稳健


  • A和B中哪一个更好?或者也许它不重要?

    它无关紧要。不必键入
    self
    很好,Python也不必进行属性查找


    但是,如果
    self.x
    是一个在设置或获取时以某种方式转换值的属性,那么您没有选择,这取决于您是否需要使用原始
    x
    或转换后的
    self.x

    ,这无关紧要。不必键入
    self
    很好,Python也不必进行属性查找


    但是,如果
    self.x
    是一个在设置或获取时以某种方式转换值的属性,则您没有选择,这取决于您是否需要使用原始
    x
    或转换后的
    self.x

    ,此处不进行复制
    x
    self.x
    是同一个对象。@DanielRoseman-你是对的。不过,我可能会更改代码的更高版本,使x和self.x变得不同。在这种情况下,版本B可能仍然有效,而版本A可能会中断。所以在冗长(我希望这个词存在)和脆弱之间有一个折衷。为什么不把
    y
    作为一个属性呢?然后
    @property
    defy(self):返回foo(self.x)
    。这样就很清楚关系是什么,并且
    y
    会像
    x
    那样更新。如果y只是x的函数,如示例中所示,这是正确的。如果y也是其他变量的函数,我可能希望延迟它的重新计算,直到它的其他参数也被设置或更新。如果y的重新计算非常昂贵,则尤其如此。在这种情况下,您可以根据输入记录结果,例如在字典
    {(x,…:y}
    中。可以作为描述符的一部分或在修饰的函数中实现。房地产的好处在于,在你需要它之前,你不必担心它。这里没有复制
    x
    self.x
    是同一个对象。@DanielRoseman-你是对的。不过,我可能会更改代码的更高版本,使x和self.x变得不同。在这种情况下,版本B可能仍然有效,而版本A可能会中断。所以在冗长(我希望这个词存在)和脆弱之间有一个折衷。为什么不把
    y
    作为一个属性呢?然后
    @property
    defy(self):返回foo(self.x)
    。这样就很清楚关系是什么,并且
    y
    会像
    x
    那样更新。如果y只是x的函数,如示例中所示,这是正确的。如果y也是其他变量的函数,我可能希望延迟它的重新计算,直到它的其他参数也被设置或更新。如果y的重新计算非常昂贵,则尤其如此。在这种情况下,您可以根据输入记录结果,例如在字典
    {(x,…:y}
    中。可以作为描述符的一部分或在修饰的函数中实现。属性的好处在于,在你需要它之前,你不必担心它。没错,但请看我对jonrsharpe的评论。@Soldalma:我不是说在这里将
    self.y=foo(x)
    转换为属性。我说的是无论什么原因,
    self.x
    已经是一个属性了。没错,但请看我对jonrsharpe的评论。@Soldalma:我不是说在这里将
    self.y=foo(x)
    转换为属性。我说的是无论出于什么原因,self.x已经是一个属性了。