我有一種感覺,我在某處看到過這個,但不再確定那是重建的記憶還是真的存在。無論如何,我找不到這種情況的參考:
class A:
a = 1
class B(A): # should have it's own class attribute 'a'
pass
class C(A): # should have it's own class attribute 'a' and newly defined 'c'
c = 3
在上面的例子中,A.a is B.a is C.a. 但是,我實際上希望在保持這種結構的同時將它們分開。這有一個很好的理由,我不想討論實體變數。原因是在我的應用程式中,所有這些類都用作“命名空間”。為了解決“問題”,我將A繼承的部分替換為自身的副本(偽代碼):
class A:
a = 1
class B(A): # B.a resolves to A.a
pass
class C(A): # C.a resolves to A.a
c = 3
copy_func(B.A, A) # investigates public attrs of A and B and create copies, now B.a is not A.a
copy_func(C.A, A) # investigates public attrs of A and B and create copies, now C.a is not A.a
uj5u.com熱心網友回復:
定義__init_subclass__以在定義子類時自動復制超類屬性。
import copy
class A:
a = []
def __init_subclass__(cls, **kwargs):
for base in cls.mro():
for attr in base.__dict__:
if attr not in cls.__dict__ and not attr.startswith("_"):
setattr(cls, attr, copy.copy(getattr(cls, attr)))
這將從超類命名空間中復制所有不以_. 在實踐中,人們可能希望應用更嚴格的規則。
的__init_subclass__定義的子類時自動運行。這意味著子類無需顯式運行代碼即可獲得復制的屬性。
class B(A):
pass
class C(A):
c = 3
assert B.a is not A.a
assert C.a is not A.a
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/369633.html
