[英]Python - method of a class with an optional argument and default value a class member
[英]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=int
和y=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
。 可選參數x
和y
等於表示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.