第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

嘗試?yán)斫饷嫦驅(qū)ο缶幊?。如何使用?duì)象組合?

嘗試?yán)斫饷嫦驅(qū)ο缶幊?。如何使用?duì)象組合?

是兩個(gè)類,定義如下:Point()Circle()class Point:    def __init__(self, x, y):        self._x = x        self._y = y    @property    def x(self):        return self._x    @x.setter    def x(self, x):        self._x = x    @property    def y(self):        return self._y    @y.setter    def y(self, y):        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._yclass 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}"point1 = Point(12, 3)print(point1)point1.y = 0print(point1)point1.move(55, 7)print(point1)circle1 = Circle(4, 1, 1)print(circle1)circle1.move(2, 2)print(circle1)我試圖在 Circle 中開發(fā)方法,從類 Point 調(diào)用方法 move(x,y),而不使用繼承。首先初始化一個(gè)對(duì)象:move(x,y)circle1 = Circle(4,1,1)但是當(dāng)你使用圓圈位置仍然是(1,1):有什么問題?我想使用_x和_y來模擬私有變量!circle1.move(2,2)
查看完整描述

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ù)。PointCircle

“圓”不是“點(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)的任何兼容性。


查看完整回答
反對(duì) 回復(fù) 2022-09-27
?
揚(yáng)帆大魚

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


查看完整回答
反對(duì) 回復(fù) 2022-09-27
?
qq_遁去的一_1

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

您沒有操作正確的變量。
你圈出類的用途,但在調(diào)用你操縱和self.xself.yPoint.move(self, x, y)self._xself._y

查看完整回答
反對(duì) 回復(fù) 2022-09-27
?
不負(fù)相思意

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


查看完整回答
反對(duì) 回復(fù) 2022-09-27
  • 4 回答
  • 0 關(guān)注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)