0

tl; dr:我想知道如何将可选参数的类型设置为自定义构建的类,即;

代码:

class Point(object):
    def __init__(self,x=int,y=int):   # Initialize Point object with optional args
        self.val=(x,y)
    def __add__(self,p=Point):        # p=Point is the issue
        ...

我试过了:

def __add__(self,p=self.__class__):  # Cannot reference self in an arg.
def __add__(self,p=Point):           # Point is not defined

很长的故事:

到目前为止,我已经进行了几次搜索,但我认为它更多的是我使用的术语。

我正在构建一个 2d Point/Vector 类(我知道,已经完成了,但我正在学习并发展我的写作风格。),并且在大多数情况下,我已经厌恶使用无类型的位置参数,主要用于易于维护。

我无法弄清楚如何将可选 arg 的类型设置为自定义构建的类,例如上面的 Point,而不是 python 的内置类型之一。

注意:我知道简单地制作 pa 位置 arg 会起作用,而且确实如此,但只要没有主要原因不这样做,除了它对 python 的哲学来说有点僵化,我想键入 args 以使代码清晰。

怎样才能做到这一点,是否值得,以这种方式做事有什么缺点吗?

也非常欢迎任何有关此类事情的最佳实践的提示。

4

3 回答 3

2

加布里埃尔的回答是正确的,这可能不是你想要的。

但是关于您看到的实际症状:它与内置类型和自定义类型无关。问题是在定义函数后立即评估默认参数,但直到类主体结束后才存在类。所以你不能Point在它自己的类体内使用作为默认参数,因为在执行的那个时候,Point还不存在!

于 2014-07-23T07:35:01.677 回答
2

我认为您可能误解了代码中的内容x=inty=int正在做的事情。

class Point(object):
    def __init__(self,x=int,y=int):   # Initialize Point object with optional args
    ...
    def __add__(self,p=Point):  

创建一个实例Point

u = Point()

会产生一个对象u。可选参数xy将等于表示int type非整数的 Python 对象(此处区分整数,如 1、3、99 及其 type=int)。通常,在函数参数中使用等号指定默认值而不是类型。同样,如果参数p没有传递给函数addp将等于表示类的对象Point。它不会创建p类的实例Point。您不能预先指定函数参数的类型。此外,它们的类型可以在函数内部更改。这是因为 Python 是一种动态类型语言。

这个关于鸭子打字的页面可能有助于澄清事情。如果您愿意,您可以在传入参数后检查参数的类型并根据该信息采取行动,但基本思想是,如果它像 an 一样走路int和像 an 一样说话int,谁在乎它的实际类型是否是int.

鸭子类型文章的 Python 部分介绍了 Python 中的异常及其在这些情况下的建议用法。

于 2014-07-23T07:19:59.757 回答
1

如果我是你,我会继承元组来做到这一点:

>>> class Point(tuple):
...     def __new__ (cls, x, y):
...         return super(Point, cls).__new__(cls, (x,y))
...     def __init__(self, x, y):
...         super(Point, self).__init__(x,y)
...         self.x=int(x)
...         self.y=int(y)
...     def __add__(self,point_add):
...         if len(point_add) != 2:
...             exit("Not a coordinate")
...         new_x = self.x + int(point_add[0])
...         new_y = self.y + int(point_add[1])
...         new_point = self.__new__(Point, new_x, new_y)
...         new_point.x = new_x
...         new_point.y = new_y
...         return new_point
... 
>>> p_a = Point(1, 2)
>>> p_b = Point(1, 2)
>>> p_c = p_a + p_b
>>> print "tuple:", p_c
tuple: (2, 4)
>>> print "x:", p_c.x, "y:", p_c.y
x: 2 y: 4
>>> 

这将允许您将点视为元组,并在一定程度上将元组视为点。上述__add__()方法适用于添加元组或点。

于 2014-07-23T07:47:32.987 回答