class NiceClass():
some_value = SomeObject(...)
some_other_value = SomeOtherObject(...)
@classmethod
def get_all_vars(cls):
...
我想get_all_vars()回傳[SomeObject(...), SomeOtherObject(...)],或者更具體地說,回傳 中變數的值cls。
嘗試的解決方案對我不起作用:
return [cls.some_value, cls.some_other_value, ...](需要手動列出變數)- 子類化
Enum然后使用list(cls)(需要使用some_value.value來訪問程式中其他地方的值,型別提示也會很混亂) - namedtuples(不涉及那個主題,聽說它比 復雜得多
Enum) [value for key, value in vars(cls).items() if not callable(value) and not key.startswith("__")](由于使用太 hackyvars(cls),也由于某種原因它也包括get_all_vars因為它是 aclassmethod)
uj5u.com熱心網友回復:
有兩種方法。這是對您問題的直接回答:
class Foo:
pass
class Bar:
x: int = 1
y: str = 'hello'
z: Foo = Foo()
@classmethod
def get_all(cls):
xs = []
for name, value in vars(cls).items():
if not (name.startswith('__') or isinstance(value, classmethod)):
xs.append(value)
return xs
這就是我的建議:
from dataclasses import dataclass, fields
class Foo:
pass
@dataclass
class Bar:
x: int = 1
y: str = 'hello'
z: Foo = Foo()
@classmethod
def get_defaults(cls):
return [f.default for f in fields(cls)]
@classmethod
def get_all(cls):
return [getattr(cls, f.name) for f in fields(cls)]
結果:
Bar.get_defaults() == Bar.get_all()
# True -> [1, 'hello', __main__.Foo]
Bar.x = 10
Bar.get_defaults() == Bar.get_all()
# False -> [1, 'hello', __main__.Foo] != [10, 'hello', __main__.Foo]
uj5u.com熱心網友回復:
您可以使用最少的樣板檔案同時創建值串列并定義各個屬性。
class NiceClass():
(some_value,
some_other_value,
) = _all_values = [
SomeObject(...),
SomeOtherObject(...)
]
@classmethod
def get_all_vars(cls):
return cls._all_values
最明顯的缺點是很容易使名稱和值的順序不同步。
理想情況下,您可能想做類似的事情
class NiceClass:
_attributes = {
'some_value': SomeObject(...),
'some_other_value': SomeOtherObject(...)
}
@classmethod
def get_all_vars(cls):
return cls._attributes.values()
并有某種方法可以直接將 的內容“注入”_attributes到類命名空間中。最簡單的方法是使用一個混合類來定義__init_subclass__:
class AddAttributes:
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.__dict__.update(cls._attributes)
class NiceClass(AddAttributes):
# As above
...
uj5u.com熱心網友回復:
這可能聽起來像https://xyproblem.info/但我的解決方案也可能適用于其他情況。您可以使用__dict__or獲取物件的欄位vars(這被認為更符合 Python 風格:Python dictionary from an object's fields)
您可以執行以下操作:
class ClassTest:
def __init__(self):
self.one = 1
self.two = 2
list(vars(ClassTest()).values())
但是你會看到它有一些限制。它無法識別self.variable_name您在上面使用的未定義變數。盡管如此,它可能會對您有所幫助,因為您可以簡單地在 init.xml 中定義它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/445696.html
下一篇:如何在nginx中設定子路徑代理
