我们如何确定一个属性是属于实例还是属于 Class?
How Can We Determine Whether an Attribute belongs to the Instance or to the Class?
简介
在 Python 中,我想获取属于 class 而不是实例的对象的所有属性的列表(所有静态属性的列表)。
一些用于测试潜在解决方案的代码:
class Klass:
static_var = 'static_var string'
def __init__(self):
self.instance_var = 'instance_var string'
def instance_method(self, *args, **kwargs):
pass
@staticmethod
def static_method(*args, **kwargs):
# can be passed almost anything and ignores it.
pass
obj = Klass()
尝试失败次数:
起初我尝试了以下方法:
def class_attrs_which_are_not_instance_attrs(obj):
return set(set(type(obj).__dict__) - set(obj.__dict__))
但是,obj.__dict__
是空的,所以函数只返回 type(obj).__dict__
我注意到的一些事情:
dir(type(obj))
== dir(obj)
type(obj).__dict__
⊆dir(type(obj))
代码
这是我的解决方案:
def static_attributes(obj):
"""
Generator to return a list of names and attributes which are
class-level variables or static methods
"""
klass = type(obj)
for name, attribute in klass.__dict__.items():
if not name.startswith('__') and \
(type(attribute) in {staticmethod, classmethod} or not callable(attribute)):
yield name, attribute
for name, attribute in static_attributes(obj):
print(name)
输出
static_var
static_method
讨论
- 此生成器函数生成名称和属性列表,这些名称和属性可以是
staticmethod
、classmethod
或 class-level 变量。
- 我也过滤掉了那些dunder开头的名字(比如
__doc__
)
简介
在 Python 中,我想获取属于 class 而不是实例的对象的所有属性的列表(所有静态属性的列表)。
一些用于测试潜在解决方案的代码:
class Klass:
static_var = 'static_var string'
def __init__(self):
self.instance_var = 'instance_var string'
def instance_method(self, *args, **kwargs):
pass
@staticmethod
def static_method(*args, **kwargs):
# can be passed almost anything and ignores it.
pass
obj = Klass()
尝试失败次数:
起初我尝试了以下方法:
def class_attrs_which_are_not_instance_attrs(obj):
return set(set(type(obj).__dict__) - set(obj.__dict__))
但是,obj.__dict__
是空的,所以函数只返回 type(obj).__dict__
我注意到的一些事情:
dir(type(obj))
== dir(obj)
type(obj).__dict__
⊆dir(type(obj))
代码
这是我的解决方案:
def static_attributes(obj):
"""
Generator to return a list of names and attributes which are
class-level variables or static methods
"""
klass = type(obj)
for name, attribute in klass.__dict__.items():
if not name.startswith('__') and \
(type(attribute) in {staticmethod, classmethod} or not callable(attribute)):
yield name, attribute
for name, attribute in static_attributes(obj):
print(name)
输出
static_var
static_method
讨论
- 此生成器函数生成名称和属性列表,这些名称和属性可以是
staticmethod
、classmethod
或 class-level 变量。 - 我也过滤掉了那些dunder开头的名字(比如
__doc__
)