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中哪一个更好?或者也许它不重要?它无关紧要。不必键入
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已经是一个属性了。