簡體   English   中英

將自定義類設置為該類中方法的可選參數類型

[英]Set a custom class as an optional argument's type to a method within that class

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點/向量類(我知道,已經完成了,但是我正在學習,並且正在發展自己的寫作風格。),並且在大多數情況下,我已經厭惡使用無類型的位置args,主要是為了易於維護。

我一直無法弄清楚如何將一個可選的arg的類型設置為一個自定義的內置類,例如Point Point,而不是python的內置類型之一。

注意:我知道,簡單地使pa position arg可以工作,並且確實可以,但是只要沒有主要理由不這樣做,除了對python的哲學有點僵化之外,我想鍵入args以使代碼清晰。

如何做到這一點,值得嗎?以這種方式做事是否有弊端?

也歡迎任何有關此類事情的最佳實踐的技巧。

我認為您可能會誤解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傳遞給函數add ,則p將等於表示Point類的對象。 它不會使p成為Point類的實例。 您不能預先指定函數參數的類型。 另外,可以在函數內部更改其類型。 這是因為Python是一種動態類型的語言。

有關鴨子輸入的頁面可能有助於澄清問題。 如果願意,您可以在傳入參數后檢查參數的類型並對該信息進行操作,但是基本思想是,如果參數像int一樣走,並且像int一樣講話,則誰在乎它的實際類型是否為int

鴨子打字文章的Python部分介紹了Python中的異常及其在這些情況下的建議用法。

加布里埃爾的答案是正確的,這可能不是您想要的。

但是,關於實際症狀,您將看到:與內置類型與自定義類型無關。 問題在於,一旦定義了函數,就會對默認參數進行求值,但是直到類主體結束后才存在類。 因此,您不能將Point用作其自己的類體內的默認參數,因為在執行的那一點上, Point還不存在!

如果我是你,我會給元組子類來做到這一點:

>>> 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__()方法可用於添加元組或Point。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM