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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

__add__ 返回超類的實例而不是子類

__add__ 返回超類的實例而不是子類

牧羊人nacy 2022-10-18 16:02:11
當我對某個類進行子類int化并自定義它的__add__方法并調用super().__add__(other)它時,它會返回一個實例int,而不是我的子類。我可以通過在每個返回 an 的方法中的每次調用type(self)之前添加來解決這個問題,但這似乎過分了。必須有更好的方法來做到這一點。和s也會發(fā)生同樣的事情。super()intfloatsfractions.Fractionclass A(int):    def __add__(self, other):        return super().__add__(other)x = A()print(type(x + 1))輸出:<class 'int'>預期輸出:<class '__main__.A'>
查看完整描述

3 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經(jīng)驗 獲得超6個贊

這可以使用描述符來完成。以下類使用在類體內(nèi)實例化該類時具有特殊效果的特殊方法。


class SuperCaller:


    def __set_name__(self, owner, name):

        """Called when the class is defined. owner is the class that's being

        defined. name is the name of the method that's being defined.

        """

        method = getattr(super(owner, owner), name)

        def call(self, other):

            # Note that this self shadows the __set_name__ self. They are two

            # different things.

            return type(self)(method(self, other))

        self._call = call


    def __get__(self, instance, owner):

        """instance is an instance of owner."""

        return lambda other: self._call(instance, other)



class A(int):

    __add__ = SuperCaller()



x = A()

print(type(x + 1))

輸出:<class '__main__.A'>


查看完整回答
反對 回復 2022-10-18
?
偶然的你

TA貢獻1841條經(jīng)驗 獲得超3個贊

一種方法是創(chuàng)建一個裝飾器,它可以用強制轉換包裝所需的數(shù)學運算:


def wrap_math(c):

    def wrapped(orig):

        return lambda s, o: c(orig(s,o))


    maths = ["__add__", "__sub__"]

    for op in maths:

        func = wrapped(getattr(c, op))

        setattr(c, op, func)


return c


@wrap_math

class Special(int)

    pass


 x = Special(10)

 type(x + 10)

完成您要包裝的功能列表,您應該一切順利。一種方法是創(chuàng)建一個裝飾器,它可以用強制轉換包裝所需的數(shù)學運算:


def wrap_math(c):

    def wrapped(orig):

        return lambda s, o: c(orig(s,o))


    maths = ["__add__", "__sub__"]

    for op in maths:

        func = wrapped(getattr(c, op))

        setattr(c, op, func)


return c


@wrap_math

class Special(int)

    pass


 x = Special(10)

 type(x + 10)

完成您要包裝的功能列表,您應該一切順利。


查看完整回答
反對 回復 2022-10-18
?
斯蒂芬大帝

TA貢獻1827條經(jīng)驗 獲得超8個贊

該super()函數(shù)從父類調用方法,int在這種情況下。相反,您應該在方法中初始化類__add__:


class A(int):

    def __add__(self, number):

        return A(self.numerator + number)


x = A(4)

print(type(x + 1))


查看完整回答
反對 回復 2022-10-18
  • 3 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號