4 回答

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
問題在于你沒有使用“組合” - 你只是從你的圈子類中的方法中隨機(jī)調(diào)用。該調(diào)用將失敗,因?yàn)槿绻麑⑵浞胖迷谄渌魏挝恢枚紩?huì)失?。菏且粋€(gè)實(shí)例方法,它需要一個(gè)點(diǎn)的實(shí)例來工作。Point.movePoint.move
對(duì)于“組合”,您需要具有作為類屬性的其他類的實(shí)例 - 然后在需要時(shí)調(diào)用這些實(shí)例上的方法。
例如,您的“圓圈”可能具有一個(gè)“.center”屬性,即一個(gè)點(diǎn)。然后,您只需調(diào)用一個(gè)實(shí)例 - 或者,如果您希望在 circle 類本身中使用一個(gè)方法:circle.center.move.move
class Circle:
def __init__(self, radius, x, y):
self._radius = radius
self.center = Point(x, y)
def move(self, x, y):
self.center.move(x, y)
def __repr__(self):
return f"Circle center at ({self.point}), radius: {self.radius}"
你想做什么
您的代碼試圖在傳遞 的實(shí)例時(shí)調(diào)用方法。雖然Python 3允許這樣做,但它幾乎起作用是一個(gè)純粹的巧合(如果Circle中的“x”和“y”名稱與“Point”相同,它將像Dani的答案中演示的那樣工作) - 但這不是“OOP”也不是“組合”,只是沒有引發(fā)運(yùn)行時(shí)錯(cuò)誤,因?yàn)镻ython 3將類中的實(shí)例方法視為函數(shù)。Point
Circle
“圓”不是“點(diǎn)”??紤]到幾何學(xué),你可以說“圓”和“點(diǎn)”分享了一些屬性和方法 - Python允許您通過使用多重繼承來共享它們,以及我們稱之為“mixins” - 因此您可以擁有一個(gè)具有“x”和“y”屬性的“LocationMixin”類,以及“移動(dòng)”方法,并且是“點(diǎn)”和“圓”的祖先, 這將起作用。
簡(jiǎn)化代碼
除了你的組合問題之外,重要的是要注意,在Python中,嘗試使屬性“私有”并不重要,并且為公共連接定義gotter和setters - 如果你的點(diǎn)類簡(jiǎn)單地寫成:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"{self.x}, {self.y}"
def move(self, x, y):
self.x = x
self.y = y
return self.x, self.y
如果要驗(yàn)證 x 和 y ae 設(shè)置為數(shù)字,或者驗(yàn)證值范圍,則 getter 和 setter 將有意義 - 否則,它們只是多余的。
有趣的是,Python設(shè)計(jì)了它的“屬性”,以便您可以更改屬性以擁有獲取器和設(shè)置器,并在以后添加這些驗(yàn)證,而不會(huì)破壞與以前版本的類(Point)的任何兼容性。

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
將類更改為:Circle
class Circle:
def __init__(self, radius, x, y):
self._radius = radius
self._x = x
self._y = y
def move(self, x, y):
Point.move(self, x, y)
def __repr__(self):
return f"radius = {self._radius}, \nx = {self._x},\ny = {self._y}"
例
circle1 = Circle(4, 1, 1)
print(circle1)
circle1.move(2, 2)
print(circle1)
輸出
radius = 4,
x = 1,
y = 1
radius = 4,
x = 2,
y = 2
否則,在執(zhí)行 時(shí),將創(chuàng)建兩個(gè)新字段 (),請(qǐng)參閱:Point.move_x, _y
circle1 = Circle(4, 1, 1)
circle1.move(2, 2)
print(circle1._x, circle1._y)
輸出
2 2

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
您沒有操作正確的變量。
你圈出類的用途,但在調(diào)用你操縱和self.x
self.y
Point.move(self, x, y)
self._x
self._y

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您繼續(xù)使用 Point.move(), 則使用 move() 作為靜態(tài)方法,而不是實(shí)例方法。這會(huì)將圓“自我”對(duì)象傳遞給點(diǎn).move() 方法。如果您按照其他帖子的建議將self.x更改為self._x等,它將起作用,但這是一個(gè)非常糟糕的設(shè)計(jì)。它之所以有效,是因?yàn)樗鼘?Point 內(nèi)部的“self”變量視為與 x 和 y 一起的第三個(gè)參數(shù),而不是實(shí)際的 Point 對(duì)象。例如,您可以將 Point.move() 方法重寫為如下所示的內(nèi)容,該方法仍可用于移動(dòng) Circle 對(duì)象,但設(shè)計(jì)得很糟糕:
def move2(foo,x,y):
foo._x = x
foo._y = y
print(foo._x,foo._y)
return foo._x,foo._y
此外,下面是一個(gè)鏈接,我在嘗試回答您的問題時(shí)發(fā)現(xiàn)了靜態(tài)方法與類方法的差異:)類方法與靜態(tài)方法 2020
添加回答
舉報(bào)