为了账号安全,请及时绑定邮箱和手机立即绑定

遍历python中的对象属性

遍历python中的对象属性

噜噜哒 2019-10-15 16:00:35
我有一个带有几个属性和方法的python对象。我想遍历对象属性。class my_python_obj(object):    attr1='a'    attr2='b'    attr3='c'    def method1(self, etc, etc):        #Statements我想生成一个包含所有对象属性及其当前值的字典,但是我想以一种动态的方式进行操作(因此,如果以后添加另一个属性,我也不必记住要更新我的函数)。在php中,变量可以用作键,但是python中的对象不可更改,如果我为此使用点符号,则会创建一个新属性,其名称为var,这不是我的意图。为了使事情更清楚:def to_dict(self):    '''this is what I already have'''    d={}    d["attr1"]= self.attr1    d["attr2"]= self.attr2    d["attr3"]= self.attr3    return d·def to_dict(self):    '''this is what I want to do'''    d={}    for v in my_python_obj.attributes:        d[v] = self.v    return d更新:对于属性,我的意思是仅此对象的变量,而不是方法。
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

假设您有一个诸如


>>> class Cls(object):

...     foo = 1

...     bar = 'hello'

...     def func(self):

...         return 'call me'

...

>>> obj = Cls()

调用dir该对象会返回该对象的所有属性,包括python特殊属性。尽管某些对象属性是可调用的,例如方法。


>>> dir(obj)

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo', 'func']

您始终可以使用列表理解来过滤掉特殊方法。


>>> [a for a in dir(obj) if not a.startswith('__')]

['bar', 'foo', 'func']

或者您更喜欢地图/过滤器。


>>> filter(lambda a: not a.startswith('__'), dir(obj))

['bar', 'foo', 'func']

如果要过滤掉这些方法,则可以使用内置函数callable作为检查。


>>> [a for a in dir(obj) if not a.startswith('__') and not callable(getattr(obj,a))]

['bar', 'foo']

您还可以检查您的班级与其父班级之间的区别。


>>> set(dir(Cls)) - set(dir(object))

set(['__module__', 'bar', 'func', '__dict__', 'foo', '__weakref__'])


查看完整回答
反对 回复 2019-10-15
?
阿晨1998

TA贡献2037条经验 获得超6个赞

python中的对象将其属性(包括函数)存储在称为的字典中__dict__。您可以(但通常不应该)使用它直接访问属性。如果您只想要一个列表,也可以调用dir(obj),它返回带有所有属性名称的Iterable,然后可以将其传递给getattr。


但是,需要对变量名称做任何事情通常都是不好的设计。为什么不将它们保存在集合中?


class Foo(object):

    def __init__(self, **values):

        self.special_values = values

然后,您可以使用 for key in obj.special_values:


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 3264 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信