這就是我想要做的:
class Base:
_type = None
name: str = _type.name
class a(Base):
_type = UnityType
a_instance = a()
a_instance.name # Expecting UnityType.name to be some string.
在嘗試這個時,我得到'NoneType' object has no attribute 'name'. 原因很清楚,也可以理解。但是如何將實作變數類的責任傳遞給子類呢?
uj5u.com熱心網友回復:
我認為您需要Base.name成為 a property,以便在訪問它而不是在Base定義時對其進行評估:
from typing import Optional, Protocol, Type
class Named(Protocol):
name: str
class Base:
_type: Optional[Type[Named]] = None
@classmethod
@property
def name(cls) -> str:
assert cls._type is not None
return cls._type.name
class UnityType:
name = "Unity"
class a(Base):
_type = UnityType
a_instance = a()
print(a_instance.name) # prints "Unity"
我從您的示例中假設它UnityType是一種型別,而不是實體,并且您希望Base使用該型別或具有name類屬性的其他型別,所以我定義了一個Protocol需要它的型別并將其用于Base(以上通過 mypy 沒有抱怨)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/498096.html
上一篇:正則運算式獲取資料后|
下一篇:Python中的引數預設為類變數
