3

我正在编写一个类方法,如果没有提供其他值,我想使用类变量

def transform_point(self, x=self.x, y=self.y):

但是......这似乎不起作用:

NameError: name 'self' is not defined

我觉得有一种更聪明的方法可以做到这一点。你会怎么办?

4

2 回答 2

5

您需要使用标记值,然后将其替换为所需的实例属性。None是一个不错的选择:

def transform_point(self, x=None, y=None):
    if x is None:
        x = self.x
    if y is None:
        y = self.y

请注意,函数签名只执行一次;您不能将表达式用于默认值,并期望它们随着每次调用函数而改变。

如果您必须能够设置xyNone那么您需要使用不同的、唯一的单例值作为默认值。在这种情况下,使用的实例object()通常是一个很好的哨兵:

_sentinel = object()

def transform_point(self, x=_sentinel, y=_sentinel):
    if x is _sentinel:
        x = self.x
    if y is _sentinel:
        y = self.y

现在你也可以打电话.transform_point(None, None)了。

于 2013-03-07T12:08:10.103 回答
2
def transform_point(self, x=None, y=None):
    if x is None:
        x = self.x
    if y is None:
        y = self.y

ETC

于 2013-03-07T12:07:17.720 回答