gpt4 book ai didi

python - 我们如何确定属性属于实例还是类?

转载 作者:太空宇宙 更新时间:2023-11-03 14:01:09 25 4
gpt4 key购买 nike

简介

在Python中,我想获取属于该类而不属于实例的对象的所有属性的列表(所有静态属性的列表)。

<小时/>

一些用于测试潜在解决方案的代码:

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

讨论

  • 此生成器函数生成名称和属性列表,这些名称和属性可以是 staticmethodclassmethod 或类级变量。
  • 我还过滤掉了那些以 dunder 开头的名称(例如 __doc__)

关于python - 我们如何确定属性属于实例还是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49237781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com