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

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

擺脫顯式超級

擺脫顯式超級

湖上湖 2022-06-02 18:07:21
我想實現(xiàn)這樣的東西def after(f):    def inner(*args, **kwargs):        super().f(*args, **kwargs)        f(*args, **kwargs)    return innerclass A:  def f(self):    print ('hello')class B(A):  @after  def f(self):    print ('world')b = B()b.f()那就是我想在我的一些類中去掉顯式并用/裝飾器super替換它(也許用參數(shù))。@before@after也就是說,在這個例子中,我想hello world被打印出來。這個想法是為了增加代碼的可讀性,因為在一些類中我經(jīng)常使用多重繼承,所以我經(jīng)常重寫方法并且經(jīng)常不得不使用super().我想我可以用它inspect來確定調(diào)用裝飾器的類實例(盡管如果我有很多類實例則不確定性能)。有沒有辦法在不犧牲性能的情況下做到這一點?
查看完整描述

1 回答

?
倚天杖

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

你可以讓你的裝飾器工作,你只需要讓它成為一個描述符類,而不是一個函數(shù)。您需要實現(xiàn)該__set_name__方法以獲取對您已添加到的類的引用。使用類引用,您可以進行兩個參數(shù)的super調(diào)用:


import functools


class after:

    def __init__(self, method):

        self.method = method


    def __set_name__(self, owner, name):

        self.owner = owner

        self.name = name                 # using self.method.__name__ might be better?


    def __get__(self, instance, owner):

        if instance is None:

            return self

        return functools.partial(self, instance)


    def __call__(self, instance, *args, **kwargs):

        assert(self.owner is not None and self.name is not None)

        getattr(super(self.owner, instance), self.name)(*args, **kwargs)

        return self.method(instance, *args, **kwargs)

你也可以這樣做before,這幾乎是一樣的,只是最后兩行以相反的順序(以及一些處理返回值的擺弄)。


我注意到這個裝飾器比調(diào)用super普通方法的用處要小得多,因為你不能有效地與被覆蓋的方法返回的值交互,或者改變傳遞給它的參數(shù)。沒有before或after修飾的方法可以復(fù)制這些類:


class Foo:

    def foo(self, x, y):

        return x + y


class Bar(Foo):

    def foo(self, x, y, z):

        return super().foo(x//2, y+1) * z


查看完整回答
反對 回復(fù) 2022-06-02
  • 1 回答
  • 0 關(guān)注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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