2 回答

TA貢獻1776條經(jīng)驗 獲得超12個贊
當(dāng)類定義尚未完成評估時,不能保證類對象存在并且用戶可以訪問。即使它是可訪問的,它也可能不會被初始化到您可以用它做任何有用的事情的程度。
也就是說,您也許可以獲得類的名稱。__qualname__是一個屬性,它包含類/函數(shù)/方法/描述符/生成器實例的限定名稱。您應(yīng)該能夠從類的定義中訪問它。
class Fred:
print("Fred's qualname:", __qualname__)
class Barney:
print("Barney's qualname:", __qualname__)
結(jié)果:
Fred's qualname: Fred
Barney's qualname: Fred.Barney
如果您的類未在文件級別定義,則可能需要進行一些字符串操作以將其名稱與路徑的其余部分分開。例如,將上面的示例更改print("Barney's qualname:", __qualname__.rpartition(".")[-1])為僅獲取“Barney”而不是“Fred.Barney”。
盡管我盡了最大的努力,但我找不到明確確認__qualname__在作為常規(guī)名稱而不是作為屬性訪問時具有合理值的文檔。我不完全相信這是定義明確的行為,所以我認為我不能毫無保留地支持生產(chǎn)質(zhì)量代碼。

TA貢獻1851條經(jīng)驗 獲得超5個贊
要在定義期間使用類名,您還可以使用帶有__prepare__方法的元類:
def find_logger(name):
return name + '_logger'
class PrepareClassLogger(type):
def __prepare__(name, bases, **kwargs):
return {'class_logger': find_logger(name)}
class MyClass(metaclass=PrepareClassLogger):
pass
print(MyClass.class_logger) # MyClass_logger
添加回答
舉報