在派生類中定義東西時,我有一些代碼需要參考超類:
class Base:
def foo(self):
print('foo')
def bar(self):
print('bar')
class Derived_A(Base):
meth = Base.foo
class Derived_B(Base):
meth = Base.bar
Derived_A().meth()
Derived_B().meth()
這可行,但我不喜歡Base在派生類中逐字參考。有沒有辦法使用super或類似的?
uj5u.com熱心網友回復:
這對你有用嗎?
class Base:
def foo(self):
print('foo')
def bar(self):
print('bar')
class Derived_A(Base):
def __init__(self):
self.meth = super().foo
class Derived_B(Base):
def __init__(self):
self.meth = super().bar
a = Derived_A().meth()
b = Derived_B().meth()
uj5u.com熱心網友回復:
創建新型別后,您需要在基類上查找方法。在類定義的主體中,型別和基類是不可訪問的。
就像是:
class Derived_A(Base):
def meth(self):
return super().foo()
現在,可以在幕后做一些魔術,以便在執行時暴露Base類定義的范圍,但這更臟,并且意味著您需要metaclass在類定義中提供 a 。
uj5u.com熱心網友回復:
既然你想要“魔法”,那么在深入研究元類之前,我們仍然可以采取一種明智的選擇。需要 Python 3.9
def alias(name):
def inner(cls):
return getattr(cls, name).__get__(cls)
return classmethod(property(inner))
class Base:
def foo(self):
...
class Derived_A(Base):
meth = alias("foo")
Derived_A().meth() # works
Derived_A.meth() # also works
是的,這確實需要將方法名稱作為字串傳遞,這會破壞您的 IDE 和型別檢查器對其進行推理的能力。但是,如果沒有這樣的妥協,就沒有一種好的方法可以得到你想要的東西。
真的,為了可讀性而做一些冗余可能在這里是值得的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/472795.html
上一篇:在另一個類c#中呼叫var用戶
