クラス階層があり、一部のクラス属性が子クラスでオーバーライドされている場合、子クラスのユーザーは、親クラスでのこの属性の値を気にする必要はありません。
しかし、これは私が達成したいことです:
class A:
_ITEM = "A"
@classmethod
def getClassPath(cls):
???
class B(A):
_ITEM = "B"
class C(B):
_ITEM = "C"
# expected behavior:
A.getClassPath() # "/A"
B.getClassPath() # "/A/B"
C.getClassPath() # "/A/B/C"
私の元の問題はもう少し複雑ですが、これに還元さ_ITEM
れます。階層内のすべてのクラスから属性を取得し、それらを何らかの方法で結合します。
どうすればいいですか?私の場合、多重継承はありません。
あなたが使用することができますmro
継承チェーンにアクセス属性に(メソッド解決順序を)。単純なケース:
class A:
_ITEM = "A"
@classmethod
def get_class_path(cls):
result = cls.mro()[:-1]
result = [res._ITEM for res in reversed(result)]
result = "/" + "/".join(result)
return result
さらに、を持たないクラスをスキップしたい場合は_ITEM
、次のように少し変更できますvars()
。
class A:
_ITEM = "attr_A"
@classmethod
def get_class_path(cls):
mro_list = reversed(cls.mro()[:-1])
result = []
for obj in mro_list:
if "_ITEM" in vars(obj):
result.append(obj._ITEM)
result = "/" + "/".join(result)
return result
class B(A):
# _ITEM = "attr_B"
pass
class C(B):
_ITEM = "attr_C"
出力:
B.get_class_path() # returns '/attr_A'
C.get_class_path() # returns '/attr_A/attr_C'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加